shell脚本中的if else语句

时间:2014-04-03 11:39:16

标签: shell if-statement

我有这个脚本根据您输入的参数执行不同的操作:

        #!/bin/bash
cadena="ls -alis"
while [ $# -e 0 ]
do
    case $1 in
        -p) [ $cadena = "$cadena | grep $2" ] ;;
        -o) [ if [ $2 = 'mida' ] then
                $cadena="$cadena -lS"
              elif [ $2 = 'inode' ] then
                $cadena="$cadena | sort -t 1" 
              fi
            ] ;;
        -d) [ if [ `expr substr $2 1 1`” = '/' ] then
                $cadena="$cadena $2"
              elif [ `expr substr $2 1 1`” != '/' ] then
                $cadena="$cadena `pwd`/$2" 
              fi
            ] ;;
        -s) [ $cadena="$cadena > $2" ] ;;
        shift 2
    esac
done
$cadena

使用case更新了代码。 错误与开头的错误相同,在第9行中使用elif [ $2 = 'inode' ] then语句,它表示错误的令牌。

2 个答案:

答案 0 :(得分:2)

  1. 请勿将单括号表示[ ]==混合,[ ... = ... ][[ ... == ... ]]

  2. 您不需要两个shift,您可以shift 2代替(如果这是您想要的)。

  3. 您可以使用开关替换外部if以提高可读性并避免嵌套if混乱:

    case $1 in
        -p) [...] ;;
        -o) [...] ;;
        -d) [...] ;;
        -s) [...] ;;
        *)  [...] ;;
    esac
    
  4. 您需要阅读BashFAQ/050 aka I'm trying to put a command in a variable, but the complex cases always fail!

答案 1 :(得分:0)

至少,您需要fi来关闭每个内部if语句。

脚本的第一行在#!之前有空格。如果真的如此,那么你可能会选择一个不同的外壳。

但语法错误是由thenif在同一行引起的。 shell仅识别行的开头或等效的保留字(例如,在分号之后)。所以你想要:

if [ $2 = 'mida' ]
then

if [ $2 = 'mida' ]; then