为什么回声失败?

时间:2015-11-18 04:44:18

标签: bash

我想通过这个bash创建许多新的bash脚本。这是我的代码。

#!/bin/bash
# create bash shell automatically
for file in "$*"
do
    if [ ! -e "$file" ]
    then
        touch $file
        chmod u+x $file
        echo "#!/bin/bash" >> $file
        echo "# " >> $file
        echo "create success"
    fi
done
if [ $# \> 1 ]
then
    echo "$# shell files are created!"
else
    echo "$# shell is created!"
fi

当我像这样运行这个脚本时:

./create_shell test1 test2 test3
终端说:

"line9:ambiguous redirect"
"line10:ambiguous redirect"

这是什么意思?

3 个答案:

答案 0 :(得分:2)

问题来自使用$*,无论是引用还是取消引用它。迭代位置参数的正确方法是使用"$@",注意双引号。

for file in "$@"; do
  : ...
done

甚至POSIXly:

for file do
  : ...
done

您收到了来自bash的错误消息,因为bash看到$file的内容未扩展为一个字,它被扩展为三个单独的字test1test2test3。尝试:

a='1 2 3'
echo 1 >> $a

看看会发生什么。

更不用说您破坏了使用"$@"的唯一原因。为了使这个结构起作用,如果你不想调用split+glob运算符,你还必须在从它派生的变量周围加上双引号。 Leaving variables unquote will lead to many security implications

答案 1 :(得分:-1)

'$ *'是一个不是参数数组的字符串。你可以这样做

fileArr=($*)
for file in ${fileArr[@]}
do you things

答案 2 :(得分:-2)

周围的报价" $ *"将阻止bash将传递的参数解析为单个标记。循环将在所有参数传递的情况下执行一次(即,如果您运行test.sh one two three,则echo命令将尝试重定向到"一个二三")。只需删除引号。