1:特殊符号含义
> Linux shell "2>&1" 含义
> 0:输入
> 1:标准输出
> 2:错误输出
> 2>&1: 将错误重定向到标准输出。
> #这里标准输出已经重定向到了 /dev/null。
> #那么标准错误也会输出到/dev/null
> &:让程序后台执行
> &>:可以将错误信息或者普通信息都重定向输出
> -- :清除所有的参数设置。
> $0:获取当前脚本的执行路径(相对路径/脚本名.sh)
(与dirname[执行路径,绝对路径]和basename[脚本名])
> $?:输出上一个脚本执行结果(0代表成功)
> $$:输出当前执行shell脚本的进程号(PID)。
> $#:获取参数个数
> $*:获取shell脚本传参的参数;加“ ”相当于将所有的参数当成一个参数。
> $@:获取shell脚本传参的参数;加“ ”用法效果一样。
> $!:获取上一个在后台工作的进程号(PID)。
> -n:不换行输出;{echo -n a;echo b}==>ab
> echo -e "hello\nworkd" # "-e"扩展正则,\n换行
> =~:左侧是字符串,右侧是一个模式,
> #判断左侧的字符串能否被右侧的模式所匹配:通常只在 [[ ]]
> #中使用, 模式中可以使用行首、行尾锚定符,但是模式不要加引号。
2:eval : let : …
eval:
用法:eval args
例如:cat noeval.sh
eval "echo \$$#"
sh noeval.sh arg1 arg2 (echo $2)
==>arg2
let
scale:保留小数点个数
echo "scale=2; 2/10"|bc
3:read与ping命令
> read -p "请输入:" name
> ping -c 3 -i 0.2 -w ip
> # -c 指ping的次数
> # -i 指ping的间隔时间
> # -w 指ping不通时,间隔3秒就返回
5:RANDOM命令
$RANDOM:随机取一个数值
$[RANDOM%10+1/2/3/..n]:随机取一个[0-9]的数值+n
6:运算符
expr + - \* ** / % '*'
echo $[2**3] echo $[a**3] echo $[3+5]###加减乘除
|| && ;### A ; B A执行完之后,B开始执行,前后没有逻辑关系
-z [ -z $a ] && echo y || echo n ###-z判断字符串是否为空
-s [ -s filename ] # 判断文档不为空,则为 true
! -z [! -z $a ] ### ! -z不为空
-eq -ne -gt -ge -lt -le ###equal,than,great,less,not
-e :判断文件是否存在{exist}
-d :判断是否为目录
-f :判断是否为文件
-a : 且
-o : 或
-z : 是否为空
-n : 不为空
-r -w -x :判断是否可读写执。。
cat tac ###与cat相反输出
wait ###等后台所有进程都结束后再退出。。
${#str} ###获取字符串str的长度
条件判断案例:
https://blog.csdn.net/shang_feng_wei/article/details/90378017
7:赋值运算
a=`who | wc -l`
b=$(who | wc -l)
8:for循环格式
for 变量名 in 值列表
do
命令格式
done
例如:
for passwd in `cat /etc/passwd`
do
let i+=1
echo $i:$passwd
done
值模板:
`ls /etc/*.conf`
{1..10} ###1 2 3 .. 10
`seq 3 5` ###3 4 5 最小值为3,最大值为5
`seq 3 2 10` ### 3 5 7 9 最小值为3,最大值为10,切片为2
echo -n "" ####在循环中,-n ""代表不换行输出
9:while循环
格式:
while [条件测试]
do
命令序列
done
10:if判断格式
if [ 条件 ]
then
...
else
...
fi
11:case
格式:
case 变量值 in
值1)
命令序列1;;
值2)
命令序列2;;
*)
默认命令序列
esac
例如:
$1 $2
case $1 in
- n)
echo $2;;
- c)
echo $2;;
- r)
echo $2;;
esac
12:函数
格式1:
function 函数名{
命令序列
}
格式2:
函数名(){
命令序列
}
例如:
mycd(){
mkdir $1
}
调用:mycd /abc
创建 /abc 目录
字符串处理
abc=17603726391
echo ${#abc} ===> 11 ## $#获取参数个数
接取字符串的3种方法::
方法一:
下标从0开始
echo ${abc::6} ===> 176037 ###从0开始,截取6位
echo ${abc:2:6} ===> 603726 ###从2开始,截取6位
方法二:
下标从1开始
expr substr "$abc" 1 6 ==> 172037
方法三:
cut命令,下标从1开始
echo $abc |cut -b 1-6 -4 4 4- 8,10
字符串替换
格式:
${变量名/old/new} ### "/" 指替换第一个匹配到的
${变量名//old/new} ### "//" 替换所有匹配到的
掐头去尾
格式
${变量名#匹配值} ###去掉开头 含有匹配值的
${变量名##匹配值} ### “##”代表所有
a= root:x:0:0:root:/root:/bin/bash
${a#*:} ###以 ":" 为分隔符,匹配到第一个":"之前的删除掉
${a##*:} ###匹配所有,以":"为分隔符,把最后一个":"之前的都删掉
${a%:*} ###删除掉从右往左,第一个":"后边的所有内容
${a%%:*} ###删除掉从右往左,最后一个":"后边的所有内容
例如:
${a##*i} ###删除i前面的所有
xx=11
echo ${xx:-123} ####如果xx不存在则输出123,如果存在,输出xx
sshpass详解:
用于非交互的ssh密码验证
yum -y install sshpass
sshpass -p [passwd] ssh -p [port] root@192.168.X.X
sshpass -p [passwd] scp txt root@ip:/
相关网站解释:
https://blog.csdn.net/weixin_33819479/article/details/89820084
- sshpass案例
#!/bin/bash
for ip in `cat /root/ip`
do
sshpass -p "Yu20(zhong)21qu" ssh -p 22 root@$ip "date -R"
#ssh root@$ip "date -R"
done
- 数组案例
https://blog.csdn.net/cpongo1/article/details/89548709