温故知新,Linux命令知多少,学习Bash Shell


image

$* 和 $@

在 Bash 中没有双引号时, 它们两个被扩展后, 结果是一样的, 都是表示外部输入的参数列表.

当有双引号时, 如 “$*”, “$@”, 这个时候, 前者表示的是用 IFS (Internal Field Separator) 分隔符连接起来的统一字符, 后者则表示的是输入的每个参数.

举例如下

文档名字为 test_1.sh

#!/bin/bash

export IFS=%

cnt=1
for i in “$*”
do
    echo “Number of $cnt parameter is: $i”
    (( cnt++ ))
done

echo
echo 

cnt=1
for i in “$@”
do 
    echo “Number of $cnt parametre is: $i”
    (( cnt++ ))
done

执行这个文件:

./test_1.sh “Hello, how are you?” Second Third Fourth

输出的结果会是:

Number of 1 parameter is: Hello, how are you?%Second%Third%Fourth


Number of 1 parameter is: Hello, how are you?
Number of 2 parameter is: Second
Number of 3 parameter is: Third
Number of 4 parameter is: Fourth

解释如下

被双括号后, “$*” 表示的是用内部分割符 IFS 连接起来的一个完整的统一字符串, 注意上面的打印输出只有一个参数.

而 ”$@” 仍然表示的是各个输入的参数. 所以这也就解释了, 除非特殊情况, 为什么推荐使用 $@ 而不是 $* 展开参数列表了.

$# 获得参数列表的总个数

如果接着上面的 test_1.sh 文件, 在最后添加:

echo Number of total parameters are $#

执行后获得另外新的结果将会是:

Number of total parameteers are 4

$$, $!, $? 获得进程ID信息

$$ 获得当前进程 ID
$! 获得之前(上一个)进程 ID
$? 获得之前(上一个)进程结束的状态码 (0 表示成功, 1 表示失败)

举例如下

例如我们有一个文档, test_2.sh

#!/bin/bash

echo “Current process ID is: $$”

sleep 100 &
echo “The most recent process ID is: $!”
echo “The most recent process exit status is: $?”

执行

./test_2.sh

输出的结果:

Current process ID is: 15599
The most recent process ID is: 15600
The most recent process ID exit status is: 0

然后接着执行

ps

输出的结果会是:

  PID   TTY       TIME      CMD
14941   pts/0   00:00:00    bash
15600   pts/0   00:00:00    sleep
15601   pts/0   00:00:00    ps

解释如下

注意: 不同的机器获得进程 ID 可能和上边的举例结果不一样.

当执行 ./test_2.sh 之后, 我们得到了执行这个文件的进程 ID: 15599 , 后台执行 sleep 后, 再执行 $!, 我们可以获得这个后台进程的 ID, 结果为 15600;

由于这个进程是一个 100 秒的后台进程, 在后边的 ps 命令中, 我们很容易的就看到了这个 ID 为 15600 的后台进程.

紧接着我们执行 $?, 注意, 这个获得的进程状态码是上一个的进程结束码, 由于我们上一个命令是 echo, 而echo 是顺利结束命令的, 所以我们获得了状态码 0 , 表示 echo 命令执行成功.

$- 和 $_

$- 是 set 命令的 –h 和 –B 的参数, 表示使用内置的 set 命令扩展解释之后的参数行, 
   具体分别表示为, 记住工作路径, 和允许使用 ! 历史扩展, 详细请参阅 set 命令.

$_ (下划线) 表示的是打印上一个输入参数行, 当这个命令在开头时, 打印输出文档的绝对路径名.

举例如下:

例如我们有一个文档, test_3.sh

#!/bin/bash
echo “Current absolute file path name is: $_”
echo “$-“
echo “Second $_”

let cnt=1
echo “Third $_”
echo “$cnt”
echo “Fourth $_”

执行命令:

./test_3.sh

输出的结果是:

Current absolute file path name is: ./test_3.sh
hB
Second hB
Third cnt=1
1
Fourth 1

解释如下:

由于我们是在当前路径下执行的文档, 那么在文档开始, 所有命令之前 $_ 获得就是文档的绝对路径名称, ./test_3.sh, 这里 . (点号) 表示当前路径.

执行 $- 后, 表示使用 set 的 –h 和 –B 选项, 这时传入的参数是 hB;

第二次执行 $_ 后, 获得上次传入的参数, 表示为 hB;

在第三次执行时, 由于上次对于 let 命令传入的参数是 cnt=1, 那么这时获得的参数是 cnt=1;

第四次执行时, 对于 echo 传入的参数是扩展后的 $cnt, 也就是 1, 那么这时获得参数就是 1.

参考

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/276343.html

(0)
上一篇 2022年7月23日
下一篇 2022年7月23日

相关推荐

发表回复

登录后才能评论