一、特使符号及使用
1. $
符号 | 参数 |
---|---|
$$ | Shell本身的PID(ProcessID) |
$! | Shell最后运行的后台Process的PID |
$? | 最后运行的命令的结束代码(返回值) |
$- | 使用Set命令设定的Flag一览 |
$* | 所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$@ | 所有参数列表。如"$@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$# | 添加到Shell的参数个数 |
$0 | Shell本身的文件名 |
$1~$n | 添加到Shell的各参数值。$1是第1参数、$2是第2参数 |
$() | 做命令替换,先完成小括号里的命令,然后在引用产生的变量值如下**(命令1)**,作用同反引号 ` ` |
${ } | $var 与 ${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围 |
- 命令1
root@juzuodaliyun:~@ echo today is $(date "+%Y-%m-%d")
today is 2020-05-17
2. ## 、 %% 、#
#!/bin/bash
file=/dir1/dir2/dir3/my.file.txt
echo ${file#*/} #删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
echo ${file##*/} #删掉最后一个 / 及其左边的字符串:my.file.txt
echo ${file#*.} #删掉第一个 . 及其左边的字符串:file.txt
echo ${file##*.} #删掉最后一个 . 及其左边的字符串:txt
echo ${file%/*} #删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
echo ${file%%/*} #删掉第一个 / 及其右边的字符串:(空值)
echo ${file%.*} #删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
echo ${file%%.*} #删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
root@juzuodaliyun:/home/test@ sh test.sh
dir1/dir2/dir3/my.file.txt
my.file.txt
file.txt
txt
/dir1/dir2/dir3
二、常用关键字
1. if
if 的用法都知道,在编程中主要用于条件判断,但是需要注意的点是在Linux shell编程中特有的符号和参数
参数 | 含义 |
---|---|
-eq | 相等 = |
-ne | 不等 != |
-gt | 大于 > |
-ge | 大于等于 >= |
-lt | 小于 < |
-le | 小于等于 <= |
上述是比价常见的比较数值大小的参数
还有另外的参数用于判断文件是否存在,文件及是否为空,文件大小等等,如果是在其他编程语言中,你需要重新写一个函数用于判断,然后字啊条件语句中引用函数并传参,但是在shell中个,你只需要一个参数就可以搞定~
参数 | 含义 |
---|---|
-r | 用户可读为真 |
-w | 用户可写为真 |
-x | 用户可执行为真 |
-f | 文件为正规文件为真 |
-d | 文件为目录为真 |
-c | 文件为字符特殊文件为真 |
-b | 文件为块特殊文件为真 |
-s | 文件大小非0时为真 |
-t | 当文件描述符(默认为1)指定的设备为终端时为真 |
-a | 与 |
-o | 或 |
! | 非 |
上面的三种写在括号内,对应的 && || 写在中括号之间。例如,if [ "$a" eq 1 -o "$b" eq 2 ] && [ "$c" eq 3 ]
2.dirname、basename
如何把
/dir1/dir2/dir3/file
中的,前半部分:/dir1/dir2/dir3
和最后部分file
分割,这个用字符串分隔及${str//}来处理还比较难办,这个时候basename和dirname命令就很方便了。
(1) dirname
dirname命令可以取给定路径的目录部分,一般在shell脚本中用的比较多,命令行中使用的较少。
root@juzuodaliyun:/home/test@ dirname /home/test/test.sh
/home/test
下面这段是找到的一个大佬博主写的例子,感觉很好,贴在这里跟大家分享~
!/bin/bash
# 跳转到脚本所在目录
cd $(dirname "$0") || exit 1
# 对上面的脚本的解释
$0 当前Shell程序的文件名
dirname $0 获取当前Shell程序的路径
cd $(dirname $0) 进入当前Shell程序的目录
exit 1 如果获取不到则退出脚本
# ————————————————
#版权声明:本文为CSDN博主「杰瑞26」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
#原文链接:https://blog.csdn.net/Jerry_1126/article/details/79872110
(2) basename
和dirname作用类似但是相反,basename命令用于去掉文件名的目录和后缀~
root@juzuodaliyun:/home/test@ basename /home/test/test.sh
test.sh
3. local
顾名思义,local命令用于声明局部变量,这个命令在shell脚本中一般是在函数内部用来声明局部边变量使用
- Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。
- Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。
- 如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。
#!/bin/bash
# 声明函数
func()
{
local var1;
local var2:
……
}
# 调用函数
func
4.export
export:将自定义变量设定为系统环境变量(仅限于该次登陆操作,当前shell中有效)
所以一般在shell脚本中定义的export变量不用担心会改变系统中的环境变量设置。
语 法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。
参 数:
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
5. readlink
readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。
root@juzuodaliyun:/home/test@ readlink /usr/bin/awk
/etc/alternatives/awk
https://blog.csdn.net/tugangkai/article/details/88563162
https://www.cnblogs.com/chengd/p/7803664.html
https://blog.csdn.net/Jerry_1126/article/details/79872110
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29631743&id=4408417