我想通过这个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"
这是什么意思?
答案 0 :(得分:2)
问题来自使用$*
,无论是引用还是取消引用它。迭代位置参数的正确方法是使用"$@"
,注意双引号。
for file in "$@"; do
: ...
done
甚至POSIXly:
for file do
: ...
done
您收到了来自bash
的错误消息,因为bash
看到$file
的内容未扩展为一个字,它被扩展为三个单独的字test1
, test2
,test3
。尝试:
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命令将尝试重定向到"一个二三")。只需删除引号。