我有一个文本文件,我想将命令行参数传递到其中。例如:
./scriptname.sh abc.sh
scriptname.sh
我可以在里面写入复制abc.sh
到文本文件的命令是什么new.txt
?
答案1
类似伯恩的贝壳
在类似 Bourne 的 shell 中(正如您的.sh
扩展建议您在脚本中使用的那样):
#! /bin/sh -
if [ "$#" -gt 0 ]; then # if I was given at least 1 argument
cp -- "$1" new.txt # where $1 is the first argument... $9 the 9th
# and ${10} the 10th (not $10 which is ${1}0)
else
echo >&2 Not given enough arguments
exit 1
fi
(请注意,需要--
标记选项的结尾,以确保不会被视为以 开头的$1
选项)。cp
-
检查是否至少给出了一个参数的一种更简短的方法是:
#! /bin/sh -
cp -- "${1?Not given enough arguments}" new.txt
哪里${parameter?message}
导致 shell 退出并出现错误,包括信息如果没有设置该参数。
或者如果你真的很懒:
#! /bin/sh -u
cp -- "$1" new.txt
哪里-u
导致 shell 退出任何未设置参数的参数扩展。
复制全部论据:
#! /bin/sh -
if [ "$#" -gt 0 ]; then # if I was given at least 1 argument
cp -- "$@" /some/dir/ # where "$@" expands to all the script's
# arguments as separate arguments to cp
else
echo >&2 Not given enough arguments
exit 1
fi
(可移植的是,如果没有参数,您不能依赖${@?...}
或退出脚本)。-u
要循环参数,这就是for
构造默认循环的内容:
#! /bin/sh -
for file do
cp -- "$file" "$file.new"
done
当然你也可以这样做:
#! /bin/sh -
for file in "$@" do
cp -- "$file" "$file.new"
done
使其明确(但在某些 shell 中效率较低)。
其他贝壳
(将 arg 计数检查放在一边)
csh
/tcsh
cp -- $1:q new.txt # one argument, properly quoted cp -- $argv:q /some/dir # all arguments
rc
/es
:cp -- $1 new.txt cp -- $* /some/dir
fish
cp -- $argv[1] new.txt cp -- $argv /some/dir