如何将命令行参数传递给Shell脚本?


241

我知道Shell脚本只是像在命令提示符下执行命令一样运行命令。我希望能够像运行脚本一样运行shell脚本...也就是说,将输入值或字符串带入脚本中。我该如何做呢?

Answers:


198

shell命令和该命令的任何参数显示为编号的 shell变量:$0有命令本身的字符串值,像script./script/home/user/bin/script或什么的。任何参数显示为"$1""$2""$3"等等。参数的数量在shell变量中"$#"

解决此问题的常用方法包括shell命令getoptsshiftgetopts与C getopt()库函数非常相似。shift移动值$2$1$3$2,等等; $#递减。代码最终查看的值"$1",然后使用caseesac决定某项操作,然后执行a shift移至$1下一个参数。它只需要检查$1,也许$#


6
C getopt()是一个非常成熟的标准,但是getopt在发行版/平台之间,可执行文件并不相同。我现在是一个完全转换的getopts用户,因为它是POSIX标准。它dash也很好用,这是我首选的脚本外壳
JM Becker 2012年

164

您可以访问传递的参数与$n在那里n是参数号码- 1, 2, 3, ...。您可以像使用其他任何命令一样传递参数。

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/shellscriptname.sh argument1 argument2 argument3 

您还可以将一个Shell脚本的输出作为参数传递给另一个Shell脚本。

$/shellscriptname.sh "$(secondshellscriptname.sh)"

在shell脚本中,您可以访问带有数字的参数,例如$1第一个参数和$2第二个参数等等。

有关shell参数的更多信息


18

表格

$ ./script.sh "$@" 

是最方便的argv。arg分隔符为空格,但可以更改。记不起来有什么副手了。然后使用

 $1, $2, shift, if [ $# -ne 3 ] 

控制流量。如果case ... esac意愿足够,我通常不接受getopts 。


14

在bash脚本上,我个人喜欢使用以下脚本来设置参数:

#!/bin/bash

helpFunction()
{
   echo ""
   echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
   echo -e "\t-a Description of what is parameterA"
   echo -e "\t-b Description of what is parameterB"
   echo -e "\t-c Description of what is parameterC"
   exit 1 # Exit script after printing help
}

while getopts "a:b:c:" opt
do
   case "$opt" in
      a ) parameterA="$OPTARG" ;;
      b ) parameterB="$OPTARG" ;;
      c ) parameterC="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
   echo "Some or all of the parameters are empty";
   helpFunction
fi

# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"

使用这种结构,我们不必依赖参数的顺序,因为我们要为每个参数定义一个关键字母。同样,在错误定义参数的所有时间都会打印帮助功能。当我们有许多带有不同参数的脚本要处理时,这非常有用。它的工作方式如下:

$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC


5

在shell脚本中; 它成为变量名$ 1。第二个单词变为变量名$ 2,依此类推。

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world

可以在http://heirloom.sourceforge.net/sh/sh.1.html的Shell(sh)手册中找到更多信息。


2
欢迎来到U&L,这几乎不会增加已经给出的答案。
Archemar


0
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2

3
1)不必要2> /dev/null,2)不向现有答案中添加任何内容。
xenoid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.