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


上一篇: 无
下一篇: 无
作者邮箱: 203328517@qq.com