Shell编程Tips

1. linux中shell变量$#,$@,$0,$1,$2的含义解释: 
变量说明: 
$$ 
Shell本身的PID(ProcessID) 
$! 
Shell最后运行的后台Process的PID 
$? 
最后运行的命令的结束代码(返回值) 
$- 
使用Set命令设定的Flag一览 
$* 
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@ 
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$# 
添加到Shell的参数个数 
$0 
Shell本身的文件名 
$1~$n 
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 

 

2. $(command) 也叫做命令替换

把一个命令或者函数的输出,赋值给一个变量

varname=$(ls)

 

$((expression))

把括号内的数学计算结果赋值给变量

result=$((start + last))

 

3. 在一个script中引入其他script

source scriptname 或者 . scriptname

 

4. Intepreter line:

在script的第一行,以#!开头

#!/bin/bash

 

5. 查看环境变量

env

 

6. 通过引号可以改变命令参数的位置

echo 'This is ' a test

$0: echo

$1: 'This is '

$2: a

$3: test

 

7. $* 和 $@的区别

他们都包含了通过命令行传进来的位置参数。如果没有引号,那么他们是相同的,都是把位置参数根据空格,分割成一个个字符串

$*包含了引号即"$*",把位置参数当做一个字符串

$@包含了引号即"$@" 通过空格把,位置参数当做数组

例子:./test.sh 'a b' c

#!/bin/bash

#shell name: test.sh

echo "The total number of paras is $#"

for arg in $*
do
  echo "\$* args is: $arg"
done

#output:

#$* args is: a
#$* args is: b
#$* args is: c

for arg in $@
do
  echo "\$@ arg is: $arg"
done

#output:

#$@ args is: a
#$@ args is: b
#$@ args is: c

for arg in "$*"
do
  echo  "\$* args is: $arg"
done

#output:

#$* args is: a b c

for arg in "$@"
do
 echo "\$@ args is : $arg"
done

#output:

#$@ args is : a b
#$@ args is : c

8. set 和 shift

set命令,可以重新把参数的位置初始化

shift可以弹出第一个位置的参数,其他参数依次减一

9. 关于特殊字符" '和\

例子

myvar=testing

echo $myvar

testing

echo "$myvar"

testing

echo "'$myvar‘“

testing

echo \$myvar

$myvar

echo '$myvar'

$myvar

 

10. ls 和 each

ls

列出所有文件名,有格式

echo *

列出所有文件名,不过文件名之间有一个空格

同样适用于 ls file[0-2] 和 each file[0-2]

 

11. 使用{}去掉变量的二义性

比如 myvar=testing

echo ${myvar}_me

结果testing_me, 如果不加{},则显示空,因为$myvar_me没有定义

另外也适用${10}的位置变量

 

12. {}用于变量的赋值

${name:-word} 如果name赋值了,则显示name的值,否则显示word

${name:+word} 如果name赋值了,则显示word,否则显示空

${name:=word} 如果name赋值了,则显示name的值,否则把那么赋值为word,并且显示word

${name:?error message} 如果name没有赋值,则显示errormessage

${#name} 显示name的内容的长度。例如name=12345 则${#name}输出5

 

13. ~, ~-, ~+

~代表用户的主目录

~-上次的目录,比如你从 /bin -> /home/stony/, 则~-为/bin

~+回到当前目录,同上例子,~+为/home/stony

~username, 进入其他用户的家目录,/home/username

cd - 等同于 cd~-

 

14. 命令替换

使用反引号``,和使用$(),同样可以实现命令替换

例子

myvar=`ls -l'

myvar=$(ls -l)

 

15. 使用(())进行数学运算

可以在(())中,对变量进行赋值运算。

例如((x=3+5)), echo $x结果8。主要,(())中,变量不能加$符号

或者echo $((3+5)) 结果也是8.

 

16. 通过dc进行浮点数运算

result=$(dc -e '2.4 3.2+p')

结果5.6

 

17. read命令读取变量

read a b c d

如果输入多于4个,比如this is a test me,则最后的所有都赋值给变量d

如果少于4个,比如this is a,则没有赋值的变量为空

 

18.在shell中,控制流程的语句,比如if, while等等,0代表true,1代表false。表达式的返回值通过$?带回来,0代表true,1代表false。

 

19.位运算,只能通过(())形式得到结果,布尔运算也可以通过(())得到结果。

要注意,本身运算的结果(和我们的常识一致)和返回结果($?,和我们的常识相反)的区别

$((1&0))=0 $?=1

$((1&&0)=0 $?=1

$((1|0))=1 $?=0

$((1||0))=1 $?=0

 

20.

(expression) 返回表达式的值

!expression 表达式的值取反

expression1 && expression2 两个表达式都为true 则为true

expression1 || expression2 其中一个为true,则为true

((expre1 & expre2)) 按位与

((expre1 | expre2)) 按位或

((expre1 ^ expre2)) 按位异或

((expre1 && expre2)) 逻辑与

((expre1 || expre2)) 逻辑或

 

21. && 和 || 短路运算符

expresion1 && expression2 只有当expresion1为true的时候,也就是expresion1返回码为0的时候,才执行expresion2。换句话说,要想执行expresion2,必须expresion1得通过才行。

expresion1 || expression2 只有当expresion1为false的时候,也就是expresion1返回码不为为0的时候,才执行expresion2。换句话说,要想执行expresion2,必须expresion1执行失败才可以。

 

22.if语句

if

  then

elif

  then

else

fi

 

23. 判断语句的4种类型,也就是跟在if后面的判断语句的类型

1)test

2)[]和test一致

3)[[]]

4)(())算数运算,也可以用于逻辑预算

注意用[[]]时候,判断字符串相等[[ $user == fred ]]

用[]时候,判断字符串相等[ $user = fred ]

 

24.空语句

:或者 pass

例如 if false

then

:

else

echo "hello"

fi

 

25. String的比较

[ -z arg ] 如果arg长度为0,则为true

[ -n arg ] 如果arg长度不为0,则为true

[ arg ] 如果arg长度不为0,则为true

[[ arg1 == arg2 ]]

[[ arg1 != arg2 ]]

[[ arg1 < arg2 ]]

[[ arg2 > arg2 ]]

 

26. 算术运算比较 []和[[]]作用相同

[[ arg1  -eq arg2 ]] 等于 (( arg1 = arg2 )) 等于 [ arg1  -eq arg2 ]

[[ arg1  -ne arg2 ]] 不等 (( arg1 != arg2 )) 等于 [ arg1  -ne arg2 ]

[[ arg1  -it arg2 ]] 小于 (( arg1 < arg2 )) 等于 [ arg1  -it arg2 ]

[[ arg1  -le arg2 ]] 小于等于 (( arg1 <= arg2 )) 等于 [ arg1  -le arg2 ]

[[ arg1  -ge arg2 ]] 大于等于 (( arg1 >= arg2 )) 等于 [ arg1  -ge arg2 ]

 

27.对文件的判断

常用的

-d file 如果文件存在并且为目录

-e file 如果文件存在

-f file 如果文件存在,并且是一个常规文件

-r file 如果文件存在,并且文件可读

-w file 如果文件存在,并且文件可写

-x file 如果文件存在,并且文件可以执行

 

28. 循环for,while, until

必须都有do和done

 

29. for循环

for var in a b c 在指定的数组里循环

for var 不加任何东西,指的是取位置参数

 

30. case 结构

case

a) aaa;

b) bbb;

*) ccc;

esac

例子

read reply

>hi

case $reply in

hello)  echo "hello" ;;

hi) echo "hi" ;;

*) ehco "else";;

esac

 

31. select语句和case语句结合使用

select var in yes no cancel

do

case $var in

yes)...

...

esac

done

 

32. echo -n 指的是不要起一个新行,在原来这一行就可以。

 

33.大括号扩展 brace expansion

image.{gif,png,jpg} 等同于image.gif,image.png,image.jpg

 

34. ${}除了除去变量二义性,默认变量赋值之外,还可以模式匹配去掉字符

${variable#pattern}从变量值前面匹配最小,并且去掉

例子file=image.png

echo ${file#*.}

png

${variable##pattern}从变量值前面匹配最大,并且去掉

例子var=lot.of.word.by.comma

echo ${var##*.}

comma

${variable%pattern}从变量值后面匹配最小,并且去掉

例子file=image.png

echo ${file%.*}

image

${variable%%pattern}从变量值后面匹配最大,并且去掉

例子var=lot.of.word.by.comma

echo ${var%%.*}

lot

 

35.${}替换

${var/pattern/string} 替换一个

例如

var=StringWithLotsAndLots

echo ${var/Lots/Many}

StringWithManyAndLots

 

${var//pattern/string} 全部替换

例如

var=StringWithLotsAndLots

echo ${var//Lots/Many}

StringWithManyAndMany

 

${*/pattern/string}或者${@/pattern/string}

将位置参数中的pattern全部替换为string

 

36.${} 截取字符串

${variable:offset}

${varible:offset:length}

例如:

var=this is a very long string variable

echo ${var:5}

is a very long string variable

echo ${var:-5}

iable

echo ${var:5:8}

is a ver

 

37. ${} 显示变量的名字${!pattern*}, 注意,显示的是变量的名字,不是变量的值

mystring="this is a string"

mynumber=10

myphone="1111"

echo  ${!my*}

mystring mynumber myphone

 

38.数组变量

可以通过typeset -a arrayname设置数组变量

通过$arrayname[subscript]取值

${#arrayname[*]}显示数组中元素的个数

 

39.typeset

typeset -r var 设置只读变量

typeset -x var 设置可执行变量

通过+关闭属性,例如typeset +r var

typeset, declare, local都是声明局部变量

 

40.getopts命令

while getopts "i:o:vc" opts

do

  case $opts in

  (i) input_filename=$OPTARG;;

  (o) ouput_filename=$OPTARG;;

  (v) verbose=true;;

  (c) count=true;;

  (*) echo "else";;

  esac

done

 

41. 如果read命令没有指定变量,则$REPLY变量将存储输入的值

例如

read

>this is my test

echo $REPLY

this is my test

----------------------------------------------------------

read -a  vars

将读入参数变成数组存入vars变量中

例如

read -a vars

>this is my testing

echo ${vars[1]}

is

----------------------------------------------------------

read-p "Username> "

提示用户

----------------------------------------------------------

read -s pwd

输入密码,不显示

----------------------------------------------------------

read -t timeout

设置超时时间

----------------------------------------------------------

read -n number

设置接受的输入字符个数

 

42. trap命令

通常的格式: trap command [a list of signals]

例如 trap {echo "Interapted"; break} 2 3

如果用一个空命令,则信号将被忽略

例如 trap '' 1 2 3

如果trap后面没有任何命令,则将命令复原

例如 trap 1 2 3

INT,用户Ctrl+C中断,将按照默认执行

往往配合使用:

trap '' 1 2 3

do something import

trap 1 2 3

 

43.错误重定向

>&2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值