shell脚本:项目中常用到的语法与命令整理

前端之家收集整理的这篇文章主要介绍了shell脚本:项目中常用到的语法与命令整理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。



1.cut

cut命令可以从一个文本文件或者文本流中提取文本列。
cut语法
[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@www ~]# cut -c 字符区间 <==用于排列整齐的信息
选项与参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;

2.mount [-参数] [设备名称] [挂载点]

-a 安装在/etc/fstab文件中类出的所有文件系统。
-f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统。
-n 不把安装记录在/etc/mtab 文件中。
-r 讲文件系统安装为只读。
-v 详细显示安装信息。
-w 将文件系统安装为可写,为命令默认情况。
-t <文件系统类型> 指定设备的文件系统类型,常见的有:
ext2 是linux目前常用的文件系统
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 网络文件系统
iso9660 CD-ROM光盘标准文件系统
ntfs windows NT/2000/XP的文件系统
auto 自动检测文件系统
-o <选项> 指定挂载文件系统时的选项,有些也可写到在 /etc/fstab 中。常用的有:
defaults 使用所有选项的默认值(auto、nouser、rw、suid)
auto/noauto 允许/不允许以 –a选项进行安装
dev/nodev 对/不对文件系统上的特殊设备进行解释
exec/noexec 允许/不允许执行二进制代码
suid/nosuid 确认/不确认suid和sgid位
user/nouser 允许/不允许一般用户挂载
codepage=XXX 代码
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
remount 重新安装已经安装了的文件系统
loop 挂载“回旋设备”以及“ISO镜像文件

3.变量$#,$@,$0,$1,$

$$ :Shell本身的PID(ProcessID)
$! :Shell最后运行的后台Process的PID
$? :上一个命令执行是否成功的标志,如果执行成功则$? 为0,否则不为0
$- :使用Set命令设定的Flag一览
$* :所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ :所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# :添加到Shell的参数个数
$0 :Shell本身的文件
$1~$n :添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

4.case 语句

case语句的格式如下:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
......
esac
上面的;;有点相当于C中case中的break语句的意味了,即执行完该模式后跳出case语句,不过有点不同的就是,
shell中的case语句如果没有;;就会报错,但是C中的case语句少了break,语法上还是正确的,只是在符合该模
式后还会继续执行直到遇到break或直到结束为止。

5.inetd&

这个不是shell命令,经常在启动脚本发现他的存在,作用是:

监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。它可以为多种服务管理连接,

当 inetd 接到连接时,它能够确定连接所需的程序,启动相应的进程,并把 socket 交给它 (服务 socket 会作为程序的

标准输入、 输出错误输出描述符)。 使用 inetd 来运行那些负载不重的服务有助于降低系统负载,因为它不需要为每

个服务都启动独立的服务程序。


6.xargs

管道是实现“将前面的标准输出作为后面的标准输入”
xargs是实现“将标准输入作为命令的参数”
你可以试试运行以下命令,看看结果的不同:
echo "--help"|cat
echo "--help"|xargs cat

7.&& ||

command1 && command2
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;
换句话说,“如果这个命令执行成功&&那么执行这个命令”。
command1 || command2
||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);
或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。
示例:malihou@ubuntu:~$ rm ~/Desktop/1.txt && echo "success" || echo "fail"
如果 ~/Desktop 目录下存在文件 1.txt,将输出 success 提示信息;否则输出 fail 提示信息。

8.>>是追加,>是覆盖

经常看到 echo > /path/name #意思就是这个/path/name文件内容置空。


9.整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))


10.文件比较运算符

-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]


11. local一般用于局部变量声明,多在在函数内部使用。

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

12. export:将自定义变量设定为系统环境变量

(在命令行使用expor 修改变量t时,仅限于该次登陆操作,当前shell中有效,如果会出现在/etc/rc.d/rcS等类似文件中,表示全局有效)

语  法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改删除环境变量,供后续执行的程序使用。
参  数:
-f  代表[变量名称]中为函数名称
-n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p  列出所有的shell赋予程序的环境变量。

13.EXPORT_SYMBOL();

(这个又跑题了,它不属于shell命令,是驱动程序中用到的)

把内核函数的符号导出,也可以理解成将函数名作为符号导出;符号的意思就是函数的入口地址,或者说是把这些符号和对应的地址保存起

来的,在内核运行的过程中,可以找到这些符号对应的地址的。

主要使用于下面这样的场合:
有两个我们自己的模块,其中Module B使用了Module A中的export的函数,因此在Module B的Makefile文件中必须添加
KBUILD_EXTRA_SYMBOLS += /path/to/ModuleA/Module.symvers
export KBUILD_EXTRA_SYMBOLS
这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而导致编译得到的ko加载时也会出错。



下面内容属于彩蛋部分,在项目里看到的脚本,挺实用,赶紧记下来的(后续会补充),以后方便查阅:

1.脚本里发现的,这种写法挺巧妙,命令1执行成功则不用执行命令2,否则执行命令2 [ "$platform" = "TV40D" ] || mount_hd nfs_server_start 2.下面这个判断的写法也挺巧,$?上一个命令执行是否成功,成功返回0,失败返回非0,-ne 是“不等于”的意思 if [ $? -ne 0 ];then /etc/rc.d/init_protect.sh fi

猜你在找的Bash相关文章