ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-07-22 20:02:38  阅读:164  来源: 互联网

标签:cnt Shell 温故知新 00 echo sh Linux test ID


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.

参考

标签:cnt,Shell,温故知新,00,echo,sh,Linux,test,ID
来源: https://www.cnblogs.com/taylorshi/p/16507862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有