linux shell 基础语法整理

2018-08-03 16:18:10

变量赋值时,变量名和等号之间不能有空格

name=freecls

#移除变量或者函数
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}

name=12345
#截取4个字符 - 2345
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

echo ${name##*.}  # ccc

字符串从后往前截取

path=/usr/local/sbin:/usr/local/bin

#最小截取 /usr/local/sbin:/usr/local
echo ${path%/*n}

#最大截取/usr/local/bin
echo ${path%%:*bin}

字符串替换

/ 替换一次,// 替换全部,如果要替换的字符串包含 / ,那么需要转义。

#替换一次 /bin 为 aaa
echo ${path/\/bin/aaa}

#替换所有的bin为aaa
echo ${path//bin/aaa}

字符串连接

path=111
path+=222  #111222
path=$path"333"  #111222333


数组

arr=(1 2 3 4 5 aaa)
arr[0]=2

echo ${arr[0]}
echo ${arr[1]}

#取数组长度
echo ${#arr[@]}
echo ${#arr[*]}


 数字运算

#加减乘除余
`expr 5 + 3`
`expr 5 - 3`
`expr 5 \* 3`
`expr 5 / 3`
`expr 5 % 3`

$[5+3]
$[5-3]
$[5*3]
$[5/3]
$[5%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 ]	#检测文件(包括目录)是否存在


条件判断

#test 大部分都跟上面判断一样
cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '有一个文件存在!'
else
    echo '两个文件都不存在'
fi
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 loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

# c风格
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


输入输出重定向

#infile 当成 cmd 的标准输入
#outfile 当成 cmd 的标准输出
cmd < infile > outfile

#把 cmd 的标准错误重定向到 file
cmd 2 > file

#把 cmd 的标准输出定向到file。
#把 cmd 的标准错误合并到标准输出
#即标准输出标准错误都定向到file。
cmd > file 2>&1

#下面是比较常见的命令
#把标准输出和错误都重定向到 /dev/null
cmd > /dev/null 2>&1
#3行数据喂给cat
#cat会把3行数据输出到标准输出
cat << EOF
欢迎来到
沧浪水
www.freecls.com
EOF

#3行数据存入变量tmp
tmp=`cat << EOF
欢迎来到
沧浪水
www.freecls.com
EOF`

echo $tmp     #换行符变空格

echo "$tmp"   #保留换行符


包含另一个shell文件到当前环境

. test.sh
source test.sh

格式化

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

其他

echo -e "hello \n"      #开启转义
echo -n "hello"         #不换行
echo -e "hello\c"       #一样不换行


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/f8

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。