导图社区 Shell
Shell常用操作、使用-t选项,在tmp目录下创建,否则在当前路径下创建,并返回绝对路径(可以加-d选项,创建目录),默认保存十天后删除,ubuntu和solaris系统会在重启后清理tmp文件夹。需要注意的是创建的文件需要固定格式:haha.XXXXXX,之后X会被替换成id。
编辑于2022-12-01 16:43:52 广东record
shc -rf
加密shell文件
要操作的文件名中包含空格
evince 'haha a '
source( . ) 和直接执行的区别
source 执行脚本处在当前的脚本的环境下,对环境变量的修改可以保留,所作的操作在当前shell 的上下文中。直接执行是在子shell 中进行操作,当执行完成返回父shell 时,子shell 对环境变量所作的修改不会保留,且子shell 无法直接访问位置变量
直接执行相当于开一个子进程,使用source相当于开启一个线程
查看一个命令是否是shell的内建命令
type 文件名
!!
执行上一条命令
!git
执行history中git开头的命令
!?shell?
执行history中包含shell的命令
getopt
格式化命令行传入的参数
${!#}
打印最后一个参数,大括号中不能使用”$“,但可以用”!“实现这个功能
mkdir -f文件夹
mkdir -- -f 文件夹可以创建-f文件夹,此时-f不作为选项处理
mktmp
使用-t选项,在tmp目录下创建,否则在当前路径下创建,并返回绝对路径(可以加-d选项,创建目录),默认保存十天后删除,ubuntu和solaris系统会在重启后清理tmp文件夹。需要注意的是创建的文件需要固定格式:haha.XXXXXX,之后X会被替换成id
exit $?
ls && echo haha
截断法则
xsel -o
将剪贴板内容输出到屏幕
注:需要先安装xsel
wget --no-check-certificate --spider $url
测试一个url是否有效,$?=0/1
$LINENO
当前行号
查看sh
查看当前的sh
ll /usr/bin/sh
查看默认的sh
echo $SHELL
查看支持的shell
cat /etc/shells
Conception
Statement
Shell
terminal的形式
[shell prompt] command <CR>
shell prompt
PS1
command
<CR>
符号
IFS
CR
Shell meta
||
&&
&& 前的语句为真才继续向下执行,用在 if 中 if 真,而不是返回值
=
>
<
>>
<<
documents here
命令行传参
cat EOF << | fdisk xx n p .... EOF
fdisk << EOF ... EOF
取值
$ (dollar sign)
$?
上一个命令的退出状态
$!
上一个在后台工作的进程的PID
$_
上一条命令的最后一个参数
$$
当前进程的PID
$-
当前shell的参数
| (bar / pipe / vertical bar)
& (single ampersand)
;(semicolon)
~(tidle)
~
home目录
~usrname
其他用户的home目录
~-
上一个工作目录,使用cd - 或 cd ~-
~+
当前的工作目录
~n
目录栈中编号为n的目录
~-n
目录栈中倒着数编号为n的目录
括号
parentheses(close curly bracket)
$( ) (command substitution,命令替换)
命令,等同 ` `
$(( ))
算数运算
( )
nested subshell command group,启动的命令在subshell中执行,需要考虑变量作用域问题
bracket
$[ ] (arithmetic expansion)
算数运算
[ ]
等同于test,判断
通配符中替代一个字符
/[eag][tsd][cx] (指etc)
[[ ]]
属于shell的关键字,支持类c语句(可用逻辑符),返回一个退出码;因而可以使用&&代表与,而不用 -a
brace(curly bracket)
${ } (variable substitution,变量扩展)
变量
{ }
non-named function command group,其中的命令放在一个无名函数中执行,所以是在当前shell中
通配符扩展
如: ls haha_{a,bssd}ss 相当于: ls haha_ass ls haha_bssdss
` `(backtick)
.(dot)
' '(single quote)
hard escape,硬转义
隔绝一切
" "(double quote)
soft escpe,软转义
隔绝通配符,但不隔绝变量替换
\ (back slash / escape)
escape,转义
取消alias
如:\ab,ab跳转无法正常进行
, (comma)
! (exclamation mark / bang)
? (question mark)
: (colon)
空语句
/ (forward slash)
除法运算符
路径
#(sharp / hash / crosshatch)
root用户的标志
注释
** (double-asterisk)
1. 用于目录?
本意是使用两个*代替了n层目录,因而树状的目录树中的所有符合条件的文件都会被搜索到: haha/**/*.c ,但实测 并不能
2. 幂运算
((2**3)) 结果是8
^ (circumflex / caret)
通配符中取反,如:[^abc],即不包含abc
行首
literal
常量
Wild Card
用途
用于command内匹配路径
符号及含义
?
*
[abc]
[a-k]
[!a-t]
Regular Expression
用途
用于字符串匹配
符号及含义
锚点(anchor)
^
$
\<
\>
* (asterisk / star)
通配符
=~
是否包含,如:str1=~str2,如果str1包含str2,则为真
目录栈
压栈
pushd
进入该目录,并将该目录压入目录栈;如果没有参数,则将当前目录压栈
加 -n选项,可以只压栈而不进入目录
pushd +3
从栈顶数3个的目录放到栈顶
pushd -0
从栈底数0个的目录放到栈顶,即第一个入栈的元素
出栈
popd
进入该目录,并将该目录出栈;如果没有参数,栈顶目录出栈,并进入新的栈顶
加 -n选项,可以只出栈而不进入目录
popd +3
从栈顶数三个的目录出栈
popd -3
从栈底数三个的目录出栈
显示栈内情况
dirs
清空目录栈
-c
显示家目录的绝对路径而非~
-l
一行显示一个目录(默认所有的目录显示在一行)
-p
一行显示一个目录并编号
-v
+N
显示从栈顶数的第n个目录
-N
显示从栈底数的第n个目录
变量
依据种类
本地变量
又称Shell变量,包括私有变量和用户变量。不同的shell可能包含不同的私有变量,每种Shell的私有变量都不一样
环境变量
又称用户变量,export的变量的作用对象为环境变量
依据作用域
局部变量
代码块或函数中可用
全局变量
当前shell进程中可用
环境变量
即使是该shell的子进程也可用
位置变量
${1} ~ ${n}
$*
$#
$0
${!#}
最后一个参数,因为大括号内不能写 $,所以用 ! 代替
状态变量
$?
上一个命令的退出状态
$_
上一条命令的最后一个参数
内置变量
返回值
成功
0
失败
1
执行失败,非零代表执行失败
2
使用方法不当(Incorrect usage)
126
不可执行(Not an excutable)
127
命令没有找到(Command not found)
128
无效的退出参数
>=128
信号产生
130
通过 Ctrl + c 终止的命令
255
正常范围之外的退出码
Terminal-Shortcut(Ubuntu)
Ctrl
Ctrl + r
搜索输入过的命令,可以输入关键字查找,或输入数字(代表history中的行数)
Ctrl + w
剪切当前的word
Ctrl + u
从光标处剪切至行首
Ctrl + k
从光标处剪切至行尾
Ctrl + y
黏贴
Ctrl + d
如果终端中有字符,相当于delete,如果已经没有字符了,关闭终端
Ctrl + h
backspace
Ctrl + c
终止
Ctrl + f
左箭头
Ctrl + b
右箭头
Ctrl + t
交换光标下的字符和它前一个字符
Ctrl + Left-Arrow
光标移动到上一个单词的词首
Ctrl + Right-Arrow
光标移动到下一个单词的词尾
Ctrl + S
暂停屏幕输出
Ctrl + Q
继续屏幕输出
Shift
Shift + Pageup
向上滚屏
Shift + Pagedown
向下滚屏
指令
power
shutdown -r 或 -s
halt
reboot
reset
重启当前的终端而非系统
版本信息
内核版本
uname -a/-r
vi /proc/version
系统版本
lsb_release -r/-a
vi /etc/issue
软件
evince
pdf查看软件
nautilus
资源管理器
libreoffice
文本编辑软件
moeditor
markdown编辑文件
flameshot
截图
meld
比对软件
gparted
磁盘管理
gitk
查看git信息
xsel
操作剪贴板
build-essential
打包开发环境包
我不知道
man
安装man
sudo apt-get install libc-dev
sudo apt-get install glibc-doc
安装C++文档
sudo apt-get install libstdc++6-4.7-dev
sudo apt-get install libstdc++6-4.7-doc
安装C++ STL
sudo apt-get install stl-manual
安装POSIX标准文档
sudo apt-get install manpages-posix-dev
type
who / whoami
文件操作
文件信息查看
stat
查看文件属性信息
less
分页查看文件
cat
本意为拼接两个文件,单一文件时打印该文件到终端
zcat/zless/zmore
查看压缩文件内容
文件查找
find
locate
apt install locat
updatedb
which
用于搜索/usr/bin下的 命令
whereis
查找-指定文件类型
tree | grep
文件属性查看
stat
查看属性
file
查看文件属性
readlink
查看链接属性
历史操作
history
列出历史操作,可以在bashrc中修改HISTORY_SIZE
fc
fc -e 编辑器 命令的前几个字母或命令的行数
修改该条命令并执行
fc -l
显示最近的16条历史命令
fc -n
不显示行号
fc -s
fc -s 'haha'
执行最近的一个以haha为开头的命令
fc -s cd=ls 2
把第二行的cd换成ls,并执行
!!
执行上一条命令
!git
执行history中git开头的命令
!?shell?
执行history中包含shell的命令
存储相关
du -hs
查看块设备大小
lsblk
查看块设备信息,如uuid
fdisk
存储设备管理工具
dd
格式化放置文件到指定位置
annotation
convert and copy a file
dd默认的输入输出为标准输入输出,当需要输入输出为文件时需要if of指定
dd的转换功能主要体现在大小写已经ASCII和EBCDIC之间
EBCDIC /ˈɛbsɪˌdɪk/ (Extend Binary Coded Digital Interchange Code,广义二进制编码的十进制交换码),由IBM设计用于大型系统的编码。
usage
bs=n bytes per block
block size,每次读写的字节数,即指定块的大小
cbs
convert block size,每次转换的字节数
count=n blocks
拷贝n个输入块
if=input file name
从文件输入而不是标准输入
of=output file name
输出到文件而不是标准输出
ibs=n bytes per block
input block size,每次输入的字节数,默认为512
obs=n bytes per block
output block size,每次输出的字节数,默认为512
skip=n blocks
从输入文件头跳过n个block后再开始复制
seek=n blocks
从输出文件头跳过n个block后再开始黏贴
conv=options
synopsis
options可有多种选择,用于指定转换格式问题
options
conversion
用指定的参数转换文件
用途未明
ascii
转换ebcdic为ascii
ebcdic
转换ebcdic为ascii
ibm
转换ascii为 ibm alternate ebcdic
block
依据cbs指定的size在行的结尾填充空格
unblock
依据cbs指定的size用空格填充新行
lcase
把大写字符转换为小写字符
ucase
把小写字符转换为大写字符
sparse
尝试跳过内容是NUL的输入块输出
swab
swap every pair of input bytes
nocreat
不创建输出文件
noerror
遇到错误不停止
notrunc
不截取
用途未明
sync
将每个输入块填充到bs个字节,不足部分用NUL字符补充
excl
如果输出文件已存在则判定此次操作失败
fdatasync
在终止前完成写输出文件
fsync
在终止前完成写输出文件(包括元数据)
status=level
synopsis
控制打印到stderr的信息的level
options
none
除错误信息之外的其他所有信息会被拦截
noxfer
组织最后的传输统计数据
progress
展示周期性的传输统计数据
iflag/oflag
synopsis
为输入输出添加选项
options
append
append mode,只对输出模式起作用,建议conv=no trunc
direct
使用直接io而不是流
directory
只能针对目录,否则失败
dsync
子主题
变量操作
特殊变量设置/显示
set
本地变量:包括shell私有变量和用户变量
export
显示当前导出成用户变量的Shell私有变量
env
显示用户变量
变量处理
declare
声明变量的类型,一般选项有-和+两种选项,代表开启或关闭
-i
声明变量为整数,此时变量可直接进行算术运算
-a
声明变量为数组
shift
左移$@,需要注意的是,与逻辑左移类似,被移出当前视野的变量会消失,一般搭配while循环使用
eval
添加eval的命令shell会扫描两次
比如: HA=| ; eval ls $HA grep haha 此时,由于eval的原因HA被解析为管道符号,因而语句可以实现正常的grep功能
getopt
posix
getopt optstring parameters,optstring为待处理的字符串,parameters为可检测的选项,要注意的是:a. 如某一选项需要参数,则它在parameters中需要带”:“,如果需要参数可有可无,则使用”::“;b. 如果遇到多余的参数可能会报错误,使用”-p“选项可以屏蔽提示信息
对于长选项,使用”--“分隔optstring和parameters,长选项之间用逗号隔开

getopts
bash内建命令
getopts optstring parameter,与getopt类似,但getopts每次只处理一个变量,这就使得在使用getopts可能需要绑定使用环境变量:optarg(当前处理的参数)optind(当前处理的是parameter中的第几个参数)。与getopts允许参数之间不使用空格分隔,亦可识别(-ahaha,-a是选项,haha是传入的参数)。需要注意的是,getopts
不可以使用长选项
xargs
将标准输入的内容作为下一个命令的输入
echo a ba c | xargs mkdir 会新建a ba c 三个文件夹
set --
set -- haha,此时位置变量$1就被替换成了haha
变量读入
read
-n
指定读入的字符个数,如n1指读入一个字符
-p
在提示信息后读入
$REPLY
如果read后没有指定承接的变量,则默认读入的变量全部储存在$REPLY中
-t
定时退出读取模式
-s
隐藏输入的信息,可用于密码读入
从文件读入行
cat 文件 | while read line .....
while read line ...... < log.txt
进程相关
jobs
查看所有的后台进程
+表示当前执行的,-表示下一个要执行的job
fg
把某一后台进程转前台执行
fg %2 注:2是使用jobs查看到的jobid
bg
把某一前台进程转后台
kill
kill %jobid
kill %pid
操作
exit
exit $?
服务
启动服务
init
init进程唤起所有的服务,他的配置项保存在init.d文件夹中,所以可以通过 /etc/init.d/hah restart 此类的方式重启服务
弊端是此种方式为串行执行,init进程需要先执行完前面的进程才能继续执行后面的进程
service
相当于init方式
systemctl
为解决上述弊端而发展的新的服务管理,systemd(system daemon)作为0号进程,其余服务作为子进程,并行地执行
Script
对字符串的处理
处理方法
特征字符串检测
grep
echo str1 | grep str2 if [ $? -eq 0 ]
字符串运算符
=~
if [[ $str1 =~ $str2 ]] then echo find else echo no_find fi
通配符
*$b*
“*" 可以匹配空
a=123; b=3; if [[ $a == *$b*' ]] then ...
case
analy
shell case支持通配符
[abc]
abc中的一个
[a-c]
a到c中的一个字符
|
逻辑或
*
通配符,表任意数量的字符
shell case 语句本质上是case向上匹配keyword
str1=abcd str2=c case $str1 in *"$str2"* ) ........ esac
替换
target str/old str/new str
if [[ ${str1/${str2}//} == ${str1} ]] .......
将str1中的str2替换为空,如果与原来的str1相等,则说明不包含
expr
expr str1 : str2
返回的是匹配到的值的数目
字符串截取
向右截取
按照长度截取
${str : 2}
从字符串左边数第2个字符开始截取至字符串尾
${str : 2 : 5}
从字符串左边数第2个字符开始,向后截取5个
${str : 0-2}
从字符串右边数第2个字符开始,向后截取至字符串尾
${str : 0-2 : 5}
从字符串右边数第2个字符开始,向后截取5个
按照特征字符截取
${str#str2*}
截取str中位于str2右边的部分,作为结果(出现的第一个str2为界限)
${str#*str2}
截取str中位于str2右边的部分作为结果(出现的最后一个str2为界限)
${str##*str2}
直到匹配(从前向后匹配)到的最后一个str2后,再向后截取
向左截取
${str%str2}
截取str中位于str2左边的部分,作为结果(以出现的第一个str2为界限)
${str%*str2}
截取str中位于str2左边的部分作为结果(以出现的最后一个str2为界限,从后向前匹配)
${str%%str2}
直到匹配(从后向前匹配)到的最后一个str2后,再向前截取
特征字符串替换(基于pattern matching,模式匹配)
${str/old str/new str}
用new str 替换匹配到的第一个old str
${str//old str/new str}
用new str 替换匹配到的所有的old str
${str/$old str/$new str}
如果old str 是字符串的开头,那么将old str 替换为new str
${str/%$old str/$new str}
如果old str 是字符串的结尾,那么将old str 替换为new str
字符串删除
${str/$str1}
从str中剔除匹配到的第一个str1
${str//$str1}
从str中提出匹配到的所有的str1(替换为空)
路径处理
获取路径
dirname $path
获取目录部分
如:a/b/c/haha.c 获取为:a/b/c
获取文件名
basename $path
获取文件名部分
如:a/b/c/haha.c,获取为:haha.c
basename $path $ext
获取不包含扩展名的文件名
如:a/b/c/haha.c .c,获取为:haha
使用字符串删除的方法剔除,灵活使用
处理函数(Linux 文字处理三剑客)
awk
sed
grep
反选
-v
精确查找
grep "\<the\>"
对变量的处理
输入
read
-p
prompt,带有提示信息
read -p "input please:" var
-t
time
-n
指定输入的字符数量
-e
tab补全
操作变量
shift
使变量的数量减1,显示的是第一个变量,同时也是下一次消减的变量;可以用于$#或$1~$n
变量赋值
:-或-
con=${var-default}
如果var没有被声明,则以default作为con的值
con=${var:-default}
如果var没有被声明或其值为空,则以default作为con的值
注:con的值可能是default,但var的值不变,即使用”-“不会影响到var的值
:=或=
con=${var=default}
如果var没有被声明,则default作为var的值
con=${var:=default}
如果var为空或没有被声明,则default作为var的值
注:con的值可能是default,var的值也可能是default,即使用”=“会影响到var的值
:+或+
con=${var+default}
如果var被声明,那么var的值为default
con=${var:+default}
如果var被声明(无论是否为空),那么con的值为default
:?或?
${var?default}
如果var没有被声明,则打印default
${var:?default}
如果var没有被设置,则打印default
!var*或!var@
匹配所有以var开头进行声明的变量
对参数的处理
获取参数
无序命令行参数分割
getopt
posix
getopt optstring parameters,optstring为待处理的字符串,parameters为可检测的选项,要注意的是:a. 如某一选项需要参数,则它在parameters中需要带”:“,如果需要参数可有可无,则使用”::“;b. 如果遇到多余的参数可能会报错误,使用”-p“选项可以屏蔽提示信息
对于长选项,使用”--“分隔optstring和parameters,长选项之间用逗号隔开

getopts
bash内建命令
getopts optstring parameter,与getopt类似,但getopts每次只处理一个变量,这就使得在使用getopts可能需要绑定使用环境变量:optarg(当前处理的参数)optind(当前处理的是parameter中的第几个参数)。与getopts允许参数之间不使用空格分隔,亦可识别(-ahaha,-a是选项,haha是传入的参数)。需要注意的是,getopts
不可以使用长选项
获取最后一个参数
${BASH_ARGV[0]}
命令行参数数组
${@: -1}
从右边截取一个元素(即最后一个)到字符串末尾
注意:冒号和-1之间有空格,如果没有空格会默认识别成 ":- 1",此时为赋值而非截取
${@:~0}
与${@: -1}类似,但相比于 :-,:~会加1
${@:$#}
正向截取
eval \${$#}
需要转义,否则会被解析成$$,而打印pid
eval echo "\"\${$#}\"”
转义意即将括号内相关内容作为参数而不进行替换等操作传入
参数自动补全
compgen
简介
compgen是bash的内建命令,用于查看bash当前运行的所有函数、用户、可用的命令等
使用或选项
compgen -a
列出所有别名
compgen -k
查看shell保留关键字
compgen -A
列出所有可以运行的函数
compgen -u
获取当前所有的用户
compgen -W
依据输入的词匹配word list
使用
compgen -W "单词列表,空格隔开" 输入的需要匹配的字符或字符串k
如: 命令行输入 compgen -W "apple beef banana cabbage" b 执行结果为:输出 beef banana。 同样的:命令行输入 compgen -W "apple beef banana cabbage" be 执行结果为:输出 beef 。
complete
简介
同是bash内建专有,dash没有
使用
1. 编写补全规则
常用选项
complete -W 脚本名
wordlist,后面追加供匹配的wordlist,已经该匹配规则适用的脚本名
complete -F 脚本名
使用一个函数来细化匹配规则,使用 -F 选项将该函数与调用的脚本绑定
complete -o
“-o bashdefault”:如果没有生成补全条目,就使用 bash 默认的其它补全。
“-o default”:如果没有生成补全条目,就使用 “readline” 默认的文件名补全。
“-o dirnames”:如果没有生成补全条目,就进行目录名补全。
“-o filenames”:告诉 “readline” 生成文件名,以便进行与文件名相关的处理,例如在目录名后面加上斜杠,引用特殊字符,去掉行尾的空格,目的是用于 shell 函数。
“-o noquote”:告诉 “readline” 不引用文件名,默认会进行引用。
“-o nospace”:告诉 “readline” 在补全的名称后不添加空格,默认添加空格。
“-o plusdirs”:生成补全条目之后,还会进行目录名补全并把结果添加到其它动作得到的结果中。
complete -A
“-A alias”:别名,同选项 “-a”。
“-A arrayvar”:数组变量名。
“-A binding”:“readline” 键绑定名。
“-A builtin”:shell 内建命令名,同选项 “-b”。
“-A command”:命令名,同选项 “-c”。
“-A directory”:目录名,同选项 “-d”。
“-A disabled”:不可用的 shell 内建命令名。
“-A enabled”:可用的 shell 内建命令名。
“-A export”:导出的 shell 变量名,同选项 “-e”。
“-A file”:文件名,同选项 “-f”。
“-A function”:shell 函数名。
“-A group”:组名,同选项 “-g”。
“-A helptopic”:内建命令 help 支持的帮助主题。
“-A hostname”:主机名,从 shell 环境变量 HOSTFILE 中获取。
“-A job”:作业名,同选项 “-j”。
“-A keyword”:shell 保留字,同选项 “-k”。
“-A running”:正在运行的作业名。
“-A service”:服务名,同选项 “-s”。
“-A setopt”:内建命令 set 的选项 “-o” 可用的参数。
“-A shopt”:内建命令 shopt 可接受的选项名。
“-A signal”:信号名。
“-A stopped”:暂停的作业名。
“-A user”:用户名,同选项 “-u”。
“-A variable”:所有的 shell 变量名,同选项 “-v”。
“-C command”:在子 shell 中执行命令,并把其结果作为补全条目。
“-F function”:在当前的shell环境中执行函数function,执行时,参数“$1”表示那个参数正在进行补全的命令名,参数“$2”表示补全的名称,参数“$3”表示补全的名称前面的单词,表示结束执行时,从数组变量COMPREPLY中获取补全条目。
“-G globpat”:使用文件名扩展模式 globpat 进行扩展以生成可能的补全条目。
“-P prefix”:在所有的选项应用到补全结果后,在结果前添加前缀 prefix。
“-S suffix”:在所有的选项应用到补全结果后,在结果后添加后缀 suffix。
“-W wordlist”:使用特殊变量 IFS 中的字符拆分单词列表 wordlist,并扩展拆分后的每个单词,结果中与待补全单词匹配的条目就是补全条目。
“-X filterpat”:filterpat 是进行文件名扩展时使用的模式,它作用于通过前面的选项和参数生成的补全列表,并把每个与过滤模式匹配的条目删除,模式中前导的叹号表示否定,这时会删除与过滤模式不匹配的条目。
实例
1. -F,实现自动补全
function autotab() { echo "function autotab called $@" } autotab_list=("aa" "bb" "cc" "dd" "123") function _autotab() { local cur COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=( $(compgen -W "${autotab_list[*]}" -- ${cur}) ) return 0 } complete -F _autotab autotab
2. -W,实现最简单的自动补全
新建一个脚本文件,使之一直运行。 complete -W "参数列表,空格隔开"
2. 将该规则注册称为补全规范(使该脚本常驻)
compopt
显示或修改命令的自动补全选项
字符串求长度
echo haha | wc -L
${#VAR}
大小写转换
1. ${parameter^^} 和 ${parameter,,}
val=haha vcl=HAHA echo ${val,,} HAHA echo ${vcl^^} haha
2. declare
declare -l lower="Haha" declare -u uper="haha" echo $lower haha echo $uper HAHA
3. tr
echo xxx | tr [a-z] [A-Z]
对所有的字符大小写转换
echo xxx | kbTd KB
把 k 转换成 K ,把剩余的 bTd 转换成 B
算术运算
整形
let
let的对象是表达式,因而格式为: let a=1+2
expr
expr 的对象是元素,因而格式是: expr 1 + 2
格外注意
1. expr计算的值如果需要获取,要写成: a=`expr 1 + 2`
2. 转义:如 ”*“需要写成”\*“
$(( ))
如: $(($a+$b))
$[ ]
如: $[$a+$b]
初始化变量时定义为整形
declare -i a a=3+3 echo $a
小数
bc
特点
使用时需要计算的表达式以语句参数的形式传入
指定scale=n,指定结果中保留的小数点位数,不指定则scale为0
用法
命令行中使用
bc -q(quiet) 3+d
脚本中使用
sum=`echo "scale=1; $a/$b" | bc`
sum=$(bc <<haha c=a+b d=2*c haha )
注释
注释行
#
注释代码块
1. 包装成代码块
如:if faulse then .....
如:while faulse do .....
如:((0)) & {.......}
如:[ 0 -eq 1 ] && {.........}
2. 占位符
:'............'
3. documents here
/dev/null << haha....................haha
替换
将开头统一加#
注意:所有形如${str%%str2}的删除、替换等操作需要加“*”通配符,否则会出现无法识别的现象。
Function
if
1. if xxx then ... fi
2. if xxx then ... else ... fi
3. if xxx then ... elif then ... fi
4. if [ ! -d /usr ]
case
case $1 in "haha") ;; *) :: esac
for
for $hh in $@ do ... done
while
概述
当条件为真时执行
while xxx do ... done
范例
1. while read line ...... < a.txt
2. cat a.txt | while read line
until
直到条件为真时,才开始执行循环体
until xxx do .... done
TEST
File
compare
file1 -ef file2
文件1和文件2有相同的inode号和设备号
file1 -nt file2
文件1比文件2新为真
file -ot file2
文件1比文件2旧为真
property
-a 文件存在为真
-b (block)文件存在且为块设备文件
-c (char)文件存在且为字符设备文件
-d(directory)目录存在
-e(exist)文件或目录存在
-f(file)文件存在且为常规文件
-g(set-group-id)文件存在且包含sgid权限
-G(group id)文件存在且为一个有效的gid拥有
-h 文件存在且为符号连接,同”-L“
-k(sticky) 文件存在且包含sticky权限
-L(link)文件存在且为符号连接,同“-h“
-O(others)文件存在且为一个有效的uid拥有
-p(pipe)文件存在且为pipe
-r(read)文件存在且包含可读权限
-s(size) 文件存在且size大于0
-S(socket)文件存在且为socket
-t(terminal)被test的文明描述符被一个终端打开,则返回真
-u(set-user-id)文件存在且包含suid权限
-w(write)文件存在且包含可写权限
-x(executable)文件存在且包含可执行权限
expression
!expression
expression == expression
expression !=expression
expression -a expression
and
expression -o expression
or
String
-z(zero)字符串长度为0
-n(no-zero)字符串长度不为0
=
!=
${str}
[$str],字符串存在(不为空)返回真
Integer
-gt (greater than)
-ge(greater than or equal)
-lt (less than or equal)
-eq (equal)
-ne (no equal)