Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash case语句中使用文件路径_Bash_Case Statement - Fatal编程技术网

在bash case语句中使用文件路径

在bash case语句中使用文件路径,bash,case-statement,Bash,Case Statement,我试图在part\u arr数组元素上执行以下脚本循环,具体取决于脚本应执行命令的值。在本例中,我只使用了echo语句。它似乎无法检测路径part\u arr是以/或[开头的每个分区的大小和路径 part_arr=$(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }') tmp='' for i in "${part_arr[@]}"; do case "$i" in "/boot/efi" ) echo $i

我试图在
part\u arr
数组元素上执行以下脚本循环,具体取决于脚本应执行命令的值。在本例中,我只使用了
echo
语句。它似乎无法检测路径
part\u arr
是以
/
[
开头的每个分区的大小和路径

part_arr=$(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }')

tmp=''

for i in "${part_arr[@]}"; do

    case "$i" in
    "/boot/efi" )
        echo $i     $tmp;;
    "/boot" )
        echo $i     $tmp;;
    "/var")
        echo $1     $tmp;;
    "/tmp")
        echo $1     $tmp;;
    "/home")
        echo $1     $tmp;;
    "[SWAP]")
        echo $1     $tmp;;
    "/")
        echo $1     $tmp;;
    esac

    tmp=i

done

这里有一种替代方法,通过使用易于编辑的数组来删除case语句。这可能会使维护稍微容易一些

#!/bin/bash
part_arr=($(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }'))
interesting=(
    '/'
    '/boot'
    '/boot/efi'
    '/etc/hosts'
    '/home'
    '/media/ebs0'
    '/tmp'
    '/var'
    '[SWAP]'
)
# Each entry is pair: (size, file-name).
for((i=0; i<${#part_arr[@]}; i+=2)) ; do
    fname=${part_arr[(($i+1))]}
    # O(log(N)) search is okay here because N is small.
    for j in ${interesting[@]} ; do
        if [[ "$j" == "$fname" ]] ; then
            fsize=${part_arr[$i]}
            printf '%-12s %s\n' $fname $fsize
            break
        fi
    done
done
!/bin/bash
部分arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
有趣的=(
'/'
“/boot”
“/boot/efi”
“/etc/hosts”
“/家”
“/media/ebs0”
“/tmp”
“/var”
“[交换]”
)
#每个条目都是成对的:(大小、文件名)。

对于((i=0;i这里有一种替代方法,通过使用易于编辑的数组来删除case语句。这可能会使维护稍微容易一些

#!/bin/bash
part_arr=($(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }'))
interesting=(
    '/'
    '/boot'
    '/boot/efi'
    '/etc/hosts'
    '/home'
    '/media/ebs0'
    '/tmp'
    '/var'
    '[SWAP]'
)
# Each entry is pair: (size, file-name).
for((i=0; i<${#part_arr[@]}; i+=2)) ; do
    fname=${part_arr[(($i+1))]}
    # O(log(N)) search is okay here because N is small.
    for j in ${interesting[@]} ; do
        if [[ "$j" == "$fname" ]] ; then
            fsize=${part_arr[$i]}
            printf '%-12s %s\n' $fname $fsize
            break
        fi
    done
done
!/bin/bash
部分arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
有趣的=(
'/'
“/boot”
“/boot/efi”
“/etc/hosts”
“/家”
“/media/ebs0”
“/tmp”
“/var”
“[交换]”
)
#每个条目都是成对的:(大小、文件名)。

对于((i=0;i
part\u arr
不是数组,它是一个字符串。您是否缺少命令替换周围的
()
?谢谢@BenjaminW。我需要以下命令:
part\u arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
。您可以提供下面的解决方案。
part\u arr
不是数组,而是单个字符串。您是否缺少命令替换的
()
?谢谢@BenjaminW。我需要以下解决方案:
part\u arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
。您可以提供下面的解决方案。