我有这个脚本根据您输入的参数执行不同的操作:
#!/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
语句,它表示错误的令牌。
答案 0 :(得分:2)
请勿将单括号表示[ ]
与==
混合,[ ... = ... ]
或[[ ... == ... ]]
。
您不需要两个shift
,您可以shift 2
代替(如果这是您想要的)。
您可以使用开关替换外部if
以提高可读性并避免嵌套if
混乱:
case $1 in
-p) [...] ;;
-o) [...] ;;
-d) [...] ;;
-s) [...] ;;
*) [...] ;;
esac
您需要阅读BashFAQ/050 aka I'm trying to put a command in a variable, but the complex cases always fail!。
答案 1 :(得分:0)
至少,您需要fi
来关闭每个内部if
语句。
脚本的第一行在#!
之前有空格。如果真的如此,那么你可能会选择一个不同的外壳。
但语法错误是由then
与if
在同一行引起的。 shell仅识别行的开头或等效的保留字(例如,在分号之后)。所以你想要:
if [ $2 = 'mida' ]
then
或
if [ $2 = 'mida' ]; then