linux shell 学习记录
#变量名等号之间不能有空格
name=dailei
echo $name
echo ${name}
unset name
#单引号里不解析,原样输出
your_name='qinjx!@#$%^&*()_+'
#双引号里的带$将解析
str="Hello, I know your are \"$your_name\"! \n"
name="my name is $your_name"
name="my name is ${your_name}"
#双引号里执行命令
name="my name is $(uname -r)"
name="my name is `uname -r`"
#获取长度
echo ${#name}
#截取
echo ${name:1:4}
#------------------变量的测试与内容替换--------------
#-以前面的为准
$new=${name-yang} #只要name设置了,就把$name给new
$new=${name:-yang} #name设置且不为空,就把$name给new
#+以后面的为准
$new=${name+yang} #name设置了,new=yang
$new=${name:+yang} #name设置了且不为空,new=yang
#=以前面为准
$new=${name=yang} #name没有设置,new=yang,name=yang,设置了new=$name
$new=${name:=yang} #name没有设置或为空,new=yang,name=yang,设置了且有值new=$name
#?以前面为准
$new=${name?yang} #name没有设置,yang输出到stderr
$new=${name:?yang} #name没有设置或为空,yang输出到stderr,设置了且有值new=$name
#-------------------------#/##从前往后截取------------------------------------
#path=/usr/local/php/bin:/opt/apache-maven/bin:/usr/local/sbin:/usr/local/bin
#最小截取/opt/apache-maven/bin:/usr/local/sbin:/usr/local/bin
echo ${path#/*:}
#最大截取/usr/local/bin
echo ${path##/*:}
#name=tmp.txt.aaa.ccc
#ccc
echo ${name##*.}
#-------------------------%/%%从后往前截取------------------------
#最小截取/usr/local/php/bin:/opt/apache-maven/bin:/usr/local/sbin:/usr/local
echo ${path%/*n}
#最大截取/usr/local/php/bin
echo ${path%%:*bin}
#------------------------/-//替换--------------------------------
#替换一次/bin为aaa
echo ${path/\/bin/aaa}
#替换所有的bin为aaa
echo ${path//bin/aaa}
#连字符
aa+=abcd
#数组
array_name=(value0 value1 value2 value3)
array_name[0]=123
value=${array_name[0]}
length=${#array_name[@]}
length=${#array_name[*]}
$0 #文件名
$1 #第一个参数
$# #参数个数
$$ #pid
$@ #参数 1 2 3当做3个参数
$* #参数 1 2 3当做一个参数
$? #0表示没错误,其他表示错误
`expr 5 + 3`
`expr 5 - 3`
`expr 5 \* 3`
`expr 5 / 3`
`expr 5 % 3`
re=$[2+3]
#数字运算
-eq/-ne/-gt/-lt/-ge/-le
[ $a -eq $b ]
[ $a == $b ]
[ $a -ne $b ]
[ $a != $b ]
[ !false ]
[ $a -lt 20 -o $b -gt 100]
[ $a -lt 20 || $b -gt 100]
[ $a -lt 20 -a $b -gt 100]
[ $a -lt 20 && -gt 100]
#字符串运算
[ $a = $b ]
[ $a != $b ]
[ -z $b ] #字符串长度为0返回true
[ -n $b ] #字符串长度为0返回false
[ $a ] #字符串不为空返回true
[ -b file ] #检测文件是否是块设备文件
[ -c file ] #检测文件是否是字符设备文件
[ -d file ] #检测文件是否是目录
[ -f file ] #检测文件是否是普通文件
[ -g file ] #检测文件是否设置了 SGID 位
[ -k file ] #检测文件是否设置了粘着位(Sticky Bit)
[ -p file ] #检测文件是否是有名管道
[ -u file ] #检测文件是否设置了 SUID 位
[ -r file ] #检测文件是否可读
[ -w file ] #检测文件是否可写
[ -x file ] #检测文件是否可执行
[ -s file ] #检测文件大小是否大于0,不为空返回 true
[ -e file ] #检测文件(包括目录)是否存在
echo -e "hello \n" #开启转义
echo `date`
echo -n "hello" #不换行
echo -e "hello\c" #一样不换行
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
#姓名 性别 体重kg
#郭靖 男 66.12
#杨过 男 48.65
#郭芙 女 47.99
#test 大部分都跟上面判断一样
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '有一个文件存在!'
else
echo '两个文件都不存在'
fi
#if
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
#若str为空,就把expr的值给str
${str:=expr} | ${str:-expr}
#相反
${str:-expr}
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
#for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
for((i=1;i<10000;i++))
do
echo 'aa';
done
#默认遍历参数
for option
do
echo $option
done
#while
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while true
do
command
done
#until
until condition
do
command
done
#case
case $aNum in
1|10) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
#函数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
#重定向
command1 < infile > outfile #执行command1,从文件infile读取内容,然后将输出写入到outfile中
#错误重定向到file
command 2 > file
#定向标准输出到file,把错误输出合并到标准输出,也就是全部定向到file
command > file 2>&1
#3行数据给cat的标准输入0
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
tmp=`cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF`
echo $tmp #换行变空格
echo "$tmp" #保留换行
command > /dev/null 2>&1
#包含另一个shell
. test.sh
source test.sh