shell

Posted 流世幻羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关的知识,希望对你有一定的参考价值。

入门

//第一个shell
#!/bash/bin
echo "hello world"
//赋予执行权限
chmod +x hello.sh
./hello.sh  或者 sh hello.sh

变量设置规则

1,变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写,便于区分。
2,在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
3,变量用等号连接值,等号左右两侧不能有空格。
4,变量的值如果有空格,需要使用单引号或者双引号包括。

用户自定义变量

用户自定义的变量由字母或下划线开头,由字母,数字或下划线序列组成,并且大小写字母意义不同,变量名长度没有限制。
设置变量:
习惯上用大写字母来命名变量。变量名以字母表示的字符开头,不能用数字。

 变量调用

变量调用在使用变量时,要在变量名前加上前缀“$”.使用echo 命令查看变量值。eg:echo $A

1,定义时赋值:
变量=值 
等号两侧不能有空格
eg:
STR="hello world"
A=9
2, 将一个命令的执行结果赋给变量
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
eg: aa=$((4+5))
bb=`expr 4 + 5 `
3,将一个变量赋给另一个变量
eg : A=$STR
变量叠加
eg:#aa=123
eg:#cc="$aa"456
eg:#dd=${aa}789
现象:单引号里的内容会全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意
NUM=10    
SUM="$NUM hehe"     echo $SUM     输出10 hehe
SUM2=‘$NUM hehe‘     echo $SUM2    输出$NUM hehe
set  //列出所有的变量
unset name //删除变量

环境变量

用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
export 变量名=变量值   申明变量
作用域:当前shell以及所有的子shell

位置参数变量

$n n为数字,代表命令本身,?1-代表第一到第个参数十以上的参数需要用大括号包含,如?{10}。
$* 代表命令行中所有的参数,把所有的参数看成一个整体。以"?2 … $n"的形式输出所有参数
$@ 代表命令行中的所有参数,把每个参数区分对待。以"?2" … "$n" 的形式输出所有参数
$# 代表命令行中所有参数的个数。添加到shell的参数个数

  

shift指令:参数左移,每执行一次,参数序列顺次左移一个位置,$# 的值减1,用于分别处理每个参数,移出去的参数不再可用

$* **和 $@的区别**


?@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"?2" … "$n" 的形式输出所有参数

当它们被双引号" "包含时,"会将所有的参数作为一个整体,以?1 ?n"的形式输出所有参数;"会将各个参数分开,以?1""?n" 的形式输出所有参数

shell脚本中执行测试

#!/bin/bash
echo "test $*"
for i in $*
do
  echo $i
done
echo "test $@"
for i in $@
do
  echo $i
done
echo "test "$*""
for i in "$*"
do
  echo $i
done
echo "test "$@""
for i in "$@"
do
  echo $i
done
//测试运行shell脚本
sh test.sh a b c d

预定义变量

$?  执行上一个命令的返回值   执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
$$ 当前进程的进程号(PID),即当前脚本执行时生成的进程号
$! 后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程   &
# vi pre.sh
pwd >/dev/null
echo $$
ls /etc  >/dev/null &
echo $!

read命令

read -t 30 -p "please input your name: " NAME
read -s -p "please input your age:" AGE  //隐藏查询
read -n 1 -p "please input your sex [M/F]: " GENDER

运算符

(注意:运算符前后必须要有空格) 
num1=11
num2=22
sum =$num1+$num2
expr m + n 或$((m+n)) 
expr 3 + 5   
expr 3 – 5
echo `expr 10 / 3`	
10/3的结果为3,因为是取整
expr  3 * 10     
 是转义符
计算(2 +3 )×4 的值
1 .分步计算
	S=`expr 2 + 3`
	expr $S * 4
2.一步完成计算
	expr `expr 2 + 3` * 4
	S=`expr `expr 2 + 3`  * 4`
	echo $S
	或
	 echo $(((2 + 3) * 4))
$()与${}的区别
$( )的用途和反引号``一样,用来表示优先执行的命令
eg:echo $(ls a.txt)
${ } 就是取变量了  eg:echo ${PATH}
$((运算内容)) 适用于数值运算
eg: echo $((3+1*4))

if

if/else命令
1,	单分支if条件语句
if [ 条件判断式 ]
    then
        程序
fi    
或者
if [ 条件判断式 ] ; then 
    程序
fi
eg:#!/bin/sh
if  [ -x  /etc/rc.d/init.d/httpd ]
    then
    /etc/rc.d/init.d/httpd restart
fi
单分支条件语句需要注意几个点
if语句使用fi结尾,和一般语言使用大括号结尾不同。
[ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。
2,多分支if条件语句
if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif  [ 条件判断式2 ]  
    then      
        当条件判断式2成立时,执行程序2
...省略更多条件
else
    当所有条件都不成立时,最后执行此程序
fi

事例

eg:
#!/bin/bash
read -p "please input your name:"  NAME
#echo  $NAME
if [ “$NAME” == root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME == tom ]
                then
                        echo "hello ${NAME},  welcome !"
        else
                echo "SB, get out here !"
fi

case

case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。
格式
	CMD=$1
case $CMD in
start)
	echo "starting"
	;;
Stop)
	echo "stoping"
	;;
*)
	echo "Usage: {start|stop} “
esac

for

for循环
for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。

事例  

第一种:
for N in 1 2 3 
do
	echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
第二种:
for ((i = 0; i <= 5; i++))
do
	echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
练习:计算从1到100的加和。

while

while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。

  

  

  

  

 

  

  

  

 

 

 

 

 

  

  

 

  

以上是关于shell的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 片段

vue2.0 代码功能片段

nodejs常用代码片段

sh shell片段

常用python日期日志获取内容循环的代码片段

Eclipse 中的通用代码片段或模板