Linux中执行脚本参数获取

Linux中变量$[#,@,0,1,2,*,$,?]含义
$# 是传给脚本的参数个数

$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

区别:$@, $*

相同点:都是引用所有参数
不同点:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

$*和$@详细区别请看此处
#!/bin/bash

echo "-----------------"
for key in "$@"
do
echo '$@' $key
done
echo "-----------------------------"
for key2 in $*
do
echo '$*' $key2
done

1、带引号执行及结果:
[root@localhost ~]# bash file.sh linux "python c"
-----------------
$@ linux
$@ python c
-----------------------------
$* linux
$* python
$* c
2、不带引号执行及结果:
[root@localhost ~]# bash file.sh linux python c
-----------------
$@ linux
$@ python
$@ c
-----------------------------
$* linux
$* python
$* c

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

shell中$*与$@的区别

shell中$*与$@的区别
关于$* 和 $@的 一点 认识 同是菜鸟一起学习

$*
所有的位置参数,被作为一个单词.
注意:"$*"必须被""引用.
$@
与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的
单词.
注意:"$@"必须被引用.

$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 "2 3" 4 来发现差异

没有括起来的情况是$@和$*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 "2 3" 4 来发现差异

一个小例子 ,仅供参考

[Copy to clipboard] [ - ]CODE:#!/bin/bash
echo

index=1

echo "Listing args with\"\$*\":"
for arg in "$*"

do
echo "Arg #$index=$arg"
let "index+=1"

done

echo "所有的参数被认为是一个单词"

echo

index=1

echo "Listing args with \"\$@\":"
for arg in "$@"
do
echo "Arg #$index=$arg"
let "index+=1"
done

echo "所有的参数被认为是各个独立的单词"

echo

index=1

echo "Listing args with \$* (未被引用):"
for arg in $*
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的参数被认为是各个独立的单词"

exit 0
运行后输出为

[Copy to clipboard] [ - ]CODE:[root@localhost ABS]# ./test 1 2 3 4

Listing args with"$*":
Arg #1=1 2 3 4
所有的参数被认为是一个单词

Listing args with "$@":
Arg #1=1
Arg #2=2
Arg #3=3
Arg #4=4
所有的参数被认为是各个独立的单词

Listing args with $* (未被引用):
Arg #1=1
Arg #2=2
Arg #3=3
Arg #4=4
所有的参数被认为是各个独立的单词

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

linux 传递参数

传递参数
脚本内获取参数的格式为:$n,n是数字。
$0 表示执行的文件名
$1 表示执行脚本的第一个参数
...

特殊参数:
$# 传递到脚本的参数个数
$* 以一个字符串显示所有向脚本传递的参数
$? 显示命令执行的退出状态。0表示没有错误,其他值表明有错误。
$$ 脚本运行的当前进程ID号

如:

vim first.sh
chmod +x first.sh
./first.sh 6 7 8
在first.sh写入:

#!/bin/bash
echo "参数传递测试"
ls -lh /home
echo "第一个参数为:$1"
echo "参数个数为:$#"
echo "所有参数:$*"
echo "退出状态:$?"
echo "脚本运行的当前ID号:$$"
输出结果:
参数传递测试
总用量 40K
drwxr-xr-x 3 root root 4.0K 7月 9 20:28 backup
-rw-r--r-- 1 root root 7.7K 7月 9 11:55 kdump.conf
drwx------. 4 lingwen lingwen 4.0K 7月 6 18:43 lingwen
-rw-r--r-- 1 root root 7.5K 7月 9 10:55 lshelp.txt
drwxr-xr-x 2 root root 4.0K 7月 10 21:41 shells
-rw-r----- 1 root root 2.0K 7月 10 18:10 sudo.conf
drwxr-xr-x 3 root root 4.0K 7月 10 12:20 test
-rw-r--r-- 1 root root 310 7月 10 20:14 t.txt
第一个参数为:6
参数个数为:3
所有参数:6 7 8
退出状态:0
脚本运行的当前ID号:5007

-----------

我们可以在执行 Shell 脚本时,可以向脚本传递参数。脚本内获取参数的格式为:$n。(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……)

举例说明

我们先编写一个脚本,名字为test.sh,她的内容如下:

#!/bin/bash

echo "Shell 输出脚本名称及参数";
echo "执行的脚本名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

我们再给脚本赋予运行权限后,运行输出:

$ chmod +x test.sh 
$ ./test.sh 1 2 3

Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

处理参数扩展

除了上面的使用方式,我们经常还会用到这些:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。