资料来源
基础
Bash 中基本数据类型只有字符串类型
echo 123
Bash 中字符串的串联操作,直接将两段数据连接在一起即可,不需要任何操作符。
echo "123""456"
echo 123 456
变量
a=1
echo $a
a="www.cnblogs.com/mugetsukun"
echo $a
echo ${#a} #获取变量a保存的字符长度
a='123456'
echo $a
echo $asd #未定义变量
a=
echo $a #空变量
a="123"
echo $a 456 #变量替换,等同于echo 123 456
echo `id root`
echo $(id root)
$ id root
uid=0(root) gid=0(root) groups=0(root)
echo uid=0(root) gid=0(root) groups=0(root) # 命令替换,先执行 cmd,将 cmd 的输出结果替换到 $() 或反引号位置处
>(command)
<(command)
#进程替换,表示将 `command` 命令的输出作为一个临时文件来处理,这个临时文件可以像普通文件一样进行读写操作,但是它并没有被保存到磁盘上,而是被处理器暂存器或内存中。
$ echo <(echo cmd)
/dev/fd/63
a=123
echo $[a+3] # echo $[$a+3]
echo $((a+3)) # echo $(($a+3))
特殊变量
$n:脚本的位置参数
$0:shell或shell脚本的名称
$*:当前脚本的所有参数(不包括程序本身);
$@:扩展为位置参数,"$@"会将每个位置参数单独引起来,"$@"等价于"$1" "$2" "$3"...
$#:位置参数的个数
$$:当前Shell的进程PID,在某些子Shell(如小括号()开启的子Shell)下,会被继承。如果可以,建议使用$BASHPID替代$$
$?:最近一个前台命令的退出状态码
$!:最近一个后台命令的进程PID
$-:当前Shell环境的一些特殊设置,比如是否交互式
$_:最近一个前台命令的最后一个参数(还有其它情况,该变量用的不多,所以不追究了)
命令组合
command1 ; command2 # 先执行command1,后执行command2
command1 && command2 # 如果command1能执行,就执行command2
command1 || command2 # 如果command1不能执行,就执行command2
(command1;command2)
{command1;command2;command3; }
{
command1
command2
command3
}
基本重定向
# 文件描述符 file descriptor,fd
fd=0,/dev/stdin -> /proc/self/fd/0 # 0:标准输入
fd=1,/dev/stdout -> /proc/self/fd/1 # 1:标准输出
fd=2,/dev/stderr ->/proc/self/fd/2 # 2:标准错误
>:覆盖输出
>>:追加输出
<:输入
<<:文档输入
<<<:字符串输入
&>:将标准错误和标准输出覆盖到文件
&>>:将标准错误和标准输出追加到文件
cat file # 默认从终端中读取数据
cat < file # 改为从file读取数据
EOF:end of file
EOL:end of line
EOB:end ofi block
tee
tee
命令用于从标准输入读取数据,并将其复制到标准输出和一个或多个文件中。
$ cat data.txt | tee -a file.txt
这个命令将 data.txt
文件中的内容读取到标准输入中,然后 tee
命令将其复制到标准输出和 file.txt
文件中,并将数据追加到 file.txt
文件的末尾。
test []
sh_file=test.sh
[ -x "$sh_file" ] && ./$sh_file || { echo "不可执行,退出";exit 1; }
test -x "$sh_file" && ./$sh_file || { echo "不可执行,退出";exit 1; }
测试符
文件类
- -e 文件是否存在 (exist)
- -f 文件是否存在且为普通文件 (file)
- -d 文件是否存在且为目录 (directory)
- -b 文件是否存在且为块设备 block device
- -c 文件是否存在且为字符设备 character device
- -S 文件是否存在且为套接字文件 Socket
- -p 文件是否存在且为命名管道文件 FIFO (pipe)
- -L 文件是否存在且是一个链接文件 (Link)
文件属性类
- -r 文件是否存在且当前用户可读
- -w 文件是否存在且当前用户可写
- -x 文件是否存在且当前用户可执行
- -s 文件是否存在且大小大于 0 字节,即检测文件是否非空文件
- -N 文件是否存在,且自上次 read 后是否被 modify
文件比较
- -nt (newer than) 判断 file1 是否比 file2 新
- -ot (older than) 判断 file1 是否比 file2 旧
- -ef (equal file) 判断 file1 与 file2 是否为同一文件
数值大小
- -eq 两数值相等 (equal)
- -ne 两数值不等 (not equal)
- -gt n1 大于 n2 (greater than)
- -lt n1 小于 n2 (less than)
- -ge n1 大于等于 n2 (greater than or equal)
- -le n1 小于等于 n2 (less than or equal)
字符串比较
- -z str (zero) 判定字符串是否为空?str 为空串,则 true
- str
- -n str 判定字符串是否非空?str 为串,则 false。注:-n 可省略
- str1 = str2
- str1 == str2 str1 和 str2 是否相同,相同则返回 true。”==” 和”=” 等价
- str1 != str2 str1 是否不等于 str2,若不等,则返回 true
- str1 > str2 str1 字母顺序是否大于 str2,若大于则返回 true
- str1 < str2 str1 字母顺序是否小于 str2,若小于则返回 true
逻辑运算
-
-a 或 && (and)
两表达式同时为 true 时才为 true。
“-a” 只能在 test 或 [] 中使用,&& 只能在 [[]] 中使用 -
-o 或 || (or)
两表达式任何一个 true 则为 true。
“-o” 只能在 test 或 [] 中使用,|| 只能在 [[]] 中使用 -
!
对表达式取反 -
( )
改变表达式的优先级,为了防止被 shell 解析,应加上反斜线转义 ( )
if语句
if condition1;then
command1;
[elif condition2;then
command2;]
[else commandN;]
fi
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
if [ ! -d ~/.ssh ];then
mkdir ~/.ssh
chown -R $USER.$USER ~/.ssh
chmod 700 ~/.ssh
fi
if
:条件语句,如果条件为真则执行then
后面的命令。[ ! -d ~/.ssh ]
:检查当前用户的 home 目录下是否存在.ssh
目录。其中,[ ... ]
表示条件测试,!
表示逻辑非运算符,-d
表示检查目录是否存在,~/.ssh
表示要检查的目录路径。then
:如果条件测试为真,则执行下面的命令。mkdir ~/.ssh
:创建.ssh
目录。其中,mkdir
是创建目录的命令,~/.ssh
表示要创建的目录路径。chown -R $USER.$USER ~/.ssh
:设置目录.ssh
的拥有者和所属组为当前用户。其中,chown
命令用于设置文件或目录的拥有者和所属组,-R
表示递归设置,$USER.$USER
表示当前用户的用户名和所属组名,~/.ssh
表示要设置的目录路径。chmod 700 ~/.ssh
:设置目录.ssh
的权限为 700(rwx------),即只有当前用户具有读写执行权限,其他用户没有任何权限。其中,chmod
命令用于设置文件或目录的权限,700
表示要设置的权限值,~/.ssh
表示要设置的目录路径。fi
:条件语句结束标记,表示条件语句块的结束。
if grep 'test1' /etc/passwd &>/dev/null;then
echo '用户"test1"存在'
elif grep 'test2' /etc/passwd &>/dev/null;then
echo '用户"test2"存在'
else
echo '没有该用户,退出进程'
exit 1
fi
if
:条件语句,如果条件为真则执行then
后面的命令。grep 'test1' /etc/passwd &>/dev/null
:在文件/etc/passwd
中查找字符串test1
。其中,grep
命令用于在文件中查找指定字符串,/etc/passwd
表示要查找的文件路径,&>/dev/null
表示将命令的标准输出和标准错误输出都重定向到/dev/null
,即不显示任何输出信息。then
:如果条件测试为真,则执行下面的命令。echo '用户"test1"存在'
:输出提示信息,表示用户test1
已经存在。elif grep 'test2' /etc/passwd &>/dev/null
:如果第一个条件测试为假,则执行第二个条件测试。在文件/etc/passwd
中查找字符串test2
。其中,elif
表示如果第一个条件测试为假,则执行这个条件测试。echo '用户"test2"存在'
:输出提示信息,表示用户test2
已经存在。else
:如果两个条件测试都为假,则执行下面的命令。echo '没有该用户,退出进程'
:输出错误信息,表示应该创建用户。exit 1
:退出脚本,并将退出状态码设为 1。其中,exit
命令用于退出脚本,1
表示退出状态码。状态码为 0 表示命令执行成功,非 0 表示命令执行失败。
case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for var in item1 item2 ... itemN; do command1; command2… done;
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while循环
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
函数
function func_name() {CMD_LIST}
标签:command1,文件,Shell,echo,command2,ssh,file,Linux,手册
From: https://www.cnblogs.com/mugetsukun/p/17419109.html