shell基本用法整理

#!/bin/bash
echo "Hello!!"
for filename in $(ls ~/FPN-caffe);do
    echo "${filename} in ~/FPN-caffe"
done

myname="RRL"
readonly myname


unset myname   #delete variable but no use for read only variable

greeting="hello,"${myname}"!"
greeting1="hello,${myname}!"
greeting2='hello,'${myname}'!'
greeting3='hello,${myname}!'
echo $greeting $greeting1 $greeting2 $greeting3

echo ${#greeting}

echo ${greeting:1:5}

echo `expr index "${greeting}" o`

array_name=(wang liu he ren zhang)
array_name[5]="zhou"
echo ${array_name[@]}
echo ${array_name[*]}
echo ${#array_name[@]}
echo ${#array_name[0]}


echo "输入的第一个参数:$1"
echo "输入的第二个参数:$2"
echo "输入的第三个参数:$3"
echo "输出所有输入:\$*"
for i in "$*";do
    echo ${i}
done
echo "输出所有输入:\$@"
for i in "$@";do
    echo ${i}
done


val=`expr 333 + 444`
echo "两数之和为:333+444=${val}"
res=`expr 444 \* 2 / ${val}`
echo "res=${res}"
res1=$((${val} % ${res}))
echo "res1 = ${res1}"
if [ $1 != $2 ]
then
  echo "\$1 != \$2"
fi


if [ $1 -lt $2 ]
then
    echo "\$1 != \$2"
fi

#布尔运算符
if [ $1 -gt 1 -a $2 -lt 100 ] 
then
    echo "\$1 > 1 and \$2 < 100"
fi

if [ $1 -gt 1 -o $2 -lt 1 ]
then
    echo "\$1 > 1 or \$2 < 1"
fi

#逻辑运算符
if [[ $1 -gt 1 && $2 -lt 100 ]]
then
    echo "\$1 > 1 and \$2 < 100"
fi

#文件测试运算符
filename="/home/nbj2017/FPN-caffe/test.sh"
if [ -r ${filename} ]
then
    echo "文件可读"
else
    echo "文件不可读"
fi

if [ -w ${filename} ]
then
    echo "文件可写"
else
    echo "文件不可写"
fi

if [ -x ${filename} ]
then
    echo "文件可执行"
else
    echo "文件不可执行"
fi

if [ -f ${filename} ]
then
    echo "普通文件"
else
    echo "特殊文件"
fi

if [ -d ${filename} ]
then
    echo "是个目录"
else
    echo "不是目录"
fi

if [ -s ${filename} ]
then
    echo "文件不为空"
else
    echo "文件为空"
fi

if [ -e ${filename} ]
then
    echo "文件存在"
else
    echo "文件不存在"
fi

#echo命令的用法
read name
echo "${name} it is test"

echo -e "OK! \n"  #-e开启转义

echo -e "OK! \c"  #\c 不换行
echo -e "yes!"

echo '$name \"'  #用单引号,原样输出字符串不进行转义或取变量

echo `date`  #用`显示执行结果

#printf命令的用法
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg   #-代表左对齐, 默认为右对齐
printf "%-10s %-8s %-4.2f\n" 郭靖 男 100.3354
printf '%-10s %-8s %-4.2f\n' 郭靖k 男 79.999 #单双引号效果相同

printf "a string, no processing:<%s>\n" "A\nB"

#test 命令(可以进行数值、字符和文件三个方面的测试)
if test $1 -eq $2    #-ne 不相等 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于
then
    echo "两个数相等!"
else
    echo "两个数不相等!"
fi

str1="xiaoliu"
str2="xiaohuang"
if test ${str1} = ${str2}  #字符串测试: != 不相等 -z 字符串的长度为零则真 -n 字符串长度不为零则真
then
    echo '两个字符串相等'
else
    echo '两个字符串不相等'
fi

if test -e ./test.sh  #文件测试: -e 文件存在则真 -r 文件可读则真 -w 文件可写则真 -x 文件可执行则真
              #-s 文件存在且至少有一个字符则真 -d 文件存在且为目录则真 -c文件存在且为字符型特殊文
              #件则真 -f 文件存在且为普通文件则真 -b 文件存在且为块特殊文件则真
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

if test -e ./test.sh -a -w ./test.sh
then
    echo 'test.sh 存在并可读'
else
    echo 'test.sh 可能不存在或不可读'
fi


##############流程控制################
#if else
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 else
    echo "没有符合的条件"
fi

#for循环
for loop in 1 2 3 4 5 6
do
    echo "${loop}"
done

for strtemp in 'I am OK!' 'dddd'
do
    echo "${strtemp}"
done

#while 语句
int=1
while((${int}<=5))
do
    echo ${int}
    int=$((${int} + 1))  #或 let "int++"
done

echo '按下 退出'
echo -n '输入你喜欢的明星:'  #-n 表示不换行输出
while read star
do
    echo "${star} is really good!"
done

#无限循环
#for (( ; ; ))

#until循环
a=0
until [ ! ${a} -lt 10 ]  #条件为false的时候,继续执行循环体内的语句
do
    echo ${a}
    a=`expr ${a} + 1`
done

#case语句
echo "请输入1到3之间的数:"
echo -n "你输入的是:"
read num
case ${num} in
    1) echo '选1'
    ;;
    2) echo '选2'
    ;;
    3) echo '选3'
    ;;
    *) echo '输入有误'
    ;;
esac


#############shell 函数####################
HelloFun(){  #无参数函数
    echo 'shell 函数,啦啦啦'
}
echo "-----shell---"
HelloFun
echo "-----shell---"

FunPlus(){  #有返回值的函数
    echo -n '输入第一个要加的数:'
    read add1
    echo -n '输入第二个要加的数:'
    read add2
    return $((${add1} + ${add2}))
}
FunPlus
echo "两数之和为 $? !"  #$? 代表return的值

FunPlus2(){
    echo "第一个参数为:${1} !"
    echo "第二个参数为:${2} !"
    echo "参数总数为 $# 个!"
    echo "作为字符串输出所有参数: $* $@ !"
}
FunPlus2 22 43
echo "脚本运行的当前进程ID: $$"
echo "后台运行的最后一个进程ID: $!"
echo "显示最后命令的退出状态:(0表示没错误) $? !"


##############shell 输入/输出重定向#################
#输出重定向
who > ./test.txt  #将会清空已存在的内容
ps >> ./test.txt #将新内容添加在文件后面
echo 'we are good!' >> ./test.txt

#输入重定向
wc -l ./test.txt  #会输出文件名    
wc -l < ./test.txt    #不会输出文件名
'''
Unix/Linux命令运行时都会打开三个文件:
(1) 标准输入文件stdin:stdin的描述符为0, Unix默认从stdin读取数据;
(2) 标准输出文件stdout:文件描述符为1,Unix默认向stdout输出数据;
(3) 标准错误文件stderr:文件描述符为2,Unix向stderr中写入错误信息。
command > file 将stdout重定向到file,command < file 将stdin重定向到file

command 2 > file #将stderr重定向到file
command > file 2>&1 #将stdout和stderr合并后重定向到file
command < file1 > file2 #将stdin重定向到file1,stdout重定向到file2
'''

#Here Documet 将输入重定向到一个交互式shell脚本或程序
wc -l << EOF
大家好
shell学习
加油加油
EOF

#/dev/null文件
#command > /dev/null #/dev/null为一个特殊的文件,写入它的内容将会被丢弃,也无法读取,相当于“禁止输出”
ps > /dev/null 2>&1

###############shell文件包含##########################
'''
两种方式:
(1) . filename
(2) source filename
'''
 

你可能感兴趣的:(Linux)