Linux Shell学习笔记(5):shell编程中必用的一些基本语法($、##、%%等特殊符号;if 、dirname\basename、local、readlink、exportt等关键字)

一、特使符号及使用

1. $

符号参数
$$Shell本身的PID(ProcessID)
$!Shell最后运行的后台Process的PID
$?最后运行的命令的结束代码(返回值)
$-使用Set命令设定的Flag一览
$*所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@所有参数列表。如"$@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
$#添加到Shell的参数个数
$0Shell本身的文件名
$1~$n添加到Shell的各参数值。$1是第1参数、$2是第2参数
$()做命令替换,先完成小括号里的命令,然后在引用产生的变量值如下**(命令1)**,作用同反引号 ` `
${ }$var 与 ${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
  1. 命令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脚本中一般是在函数内部用来声明局部边变量使用

  1. Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。
  2. Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。
  3. 如果同名,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值