shell编程 --- 总爱忘,所以记在这儿

 建议用""括起变量

 

# 注释

 

转义符(Escape Character)

/b  退格键

/c   不换行

/n  换行LF

/r   回车CR

/t   tab键

/0n  n是数字,ascii字符

 

shell执行新命令时新建一个子进程,在子进程中执行

 

.    ----  在当前进程中执行

 

``  ---- 捕获命令输出

 

read 从用户输入读入

read var1 var2 var3,假如用户输入word1 word2 word3 word4,则:

$var1=word1

$var2=word2

$var3=word3 word4

 

变量:

赋值:var1="word1"

使用:echo "$var1"

去除:unset var1

 

命令行参数

$0 -- 命令名

$1,...,$9 -- 命令参数

$#  -- 参数个数(不包括$0)

$@ -- 所有命令行参数$1,...,$9,...,但是每一个用""包围

$?  -- 最后一个命令的退出状态

$* -- 所有命令行参数$1,...,$9,...

$$ -- 进程的id

 

set 设置$1,...,$9参数,如:set var1 var2,则:$1=var1 $2=var2

 

exit n 有状态退出(0--成功,其他失败)

 

条件语句:

if [ condition ]     -- 注意"["后有一空格,"]"前有一空格

then

   commands

fi

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

if [ condition ]

then

  commands

else

  commands

fi

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

if [ condition1 ]

then

  commands

elif [ condition2 ]

then

  commands

elif [ condition3 ]

then

  commands

else

  commands

fi

 

 

test命令 (数字,字符串,文件)  等价于 [ condition ]  (0--success,otherwise--failure)  man test

if test "$var" = value   等价于  if [ "$var" = value ]  注意: 比较符两侧都有一个空格,如: [ "$var1" = "$var2" ]

(1)数字

-eq 等于

-ne 不等于

-gt 大于

-ge 大于等于

-lt 小于

-le 小于等于

(2)字符串

=  等于

!=  不等

-n  是否非零长

-z  是否零长

(3)文件

-r 存在并可读?

-w 存在并可写?

-s 存在并非零长?

-f 存在并且是一个文件?

-d 存在并且是一个目录?

(4)逻辑操作符

-a and

-o or

!   not

 

x=10

x=$x+1

echo $x   得出的是10+1,因为默认为字符串连接

 

expr命令

x=10

x=`expr $x+1`

echo $x  得出11

其他示例:expr 10 /* 2 (注意:*要转义)

比较操作:  = != < <= > >=

expr表达式为真,返回1;为假,返回0

 

let命令  等价于 (( command ))  -- 注意空格

x=100

let x=x+1

echo $x  得出101 (注意:let中可以直接使用* %,不用转义)

 

 

循环语句:

for var

in list of vars

do

   commands

done

 

while [ condition ]

do

  commands

done

 

until [ condition ]   -- 为假时进入循环

do

  commands

done

 

 

shell的debug:

a脚本为:

echo "haha"
echo "$0 $1"
echo $#
echo $$

 

bash -x   显示命令(参数已替换和执行结果)

bash -x a 则,输出:

+ echo haha
haha
+ echo 'a '
a
+ echo 0
0
+ echo 10877
10877

其中带+为命令,其余为输出

 

bash -v 显示命令(参数未替换和执行结果)

bash -v a  则,输出:

echo "haha"
haha
echo "$0 $1"
a
echo $#
0
echo $$
10878

 

bash -n 不执行,只读取命令,可以查错

 

参数替换

$var                    var变量值

${var}                var变量值[例:x=10   echo $x ${x}y   打印出10 10y]

${var:-string}    如果var设置并且不为空,取$var;否则,取string

${var:+string}   如果var设置并且不为空,取string;否则,nothing happened

${var:=string}   如果var设置并且不为空,取$var;否则,$var=string

${var:?string}    如果var设置并且不为空,取$var;否则,打印出string,并退出

 

转义字符

/  后的字符为原本字符,如://
" " 中的字符为literal(除 $  `  " 外)
' ' 中的字符为literal(除 ' 外)

例如:xyz=110
echo $xyz "$xyz" '$xyz'
输出110 110 $xyz

 

shell中元字符

`  执行命令
;   多条命令
()  分组命令
&  后台运行命令
|   管道操作符(一个命令的输出用于另一个命令的输入)

.   当前进程执行命令

>  重定向输出

<  重定向输入

>> 重定向附加

:    空命令,没有效用,始终返回0(真)

~/   代表当前用户的家目录

~haha/  代表用户haha的家目录


wildcard字符

* 0或多个字符

? 1个字符

[a-z]  a-z范围

[!ab]  除了ab

 

 

trap命令(设置信号)

trap "option command" signal number

例:trap "echo i don't want to die" 15

      trap " " 15  -- 忽略信号15

      trap 15  -- 重置信号

 

 

stty命令(设置终端,具体可man stty)

stty

stty -a 显示所有选项

例如:开启 stty 选项名  关闭 stty -选项名

几个重要的选项:

echo  是否回显键入的字符

raw   关闭元字符的意义

intr    产生中断信号的键

erase 删除前一个字符的键

kill      删除一行的键

eof     文件结束信号的键

ek      重置erase和kill键

sane  设置终端字符到合理的默认值

例:stty kill /^U           kill用键[ctrl-u]

      stty sane  恢复默认


tput命令(设置终端的能力)

终端数据库terminfo文件

tput [-Ttype] init

tput [-Ttype] reset

tput [-Ttype] capability-name

能力选项

bel    回显终端的铃声类型

blink  闪烁

bold  粗体

clear  清屏

cup r c  移动光标到r行c列

dim  

ed   从当前光标清除到屏幕的最后

el    从当前光标清除到行最后

smso     bold=`tput smso`粗体

rmso      offbold=`tput rmso`取消粗体

smul   开始下划线模式

rmul   结束下划线模式

rev     反显

sgr0   关闭所有属性

例:

tput clear

tput cup 10 20

tput blink

tput smul

tput rmul

bell=`tput bel`

 

 

case结构

case var in

pattern_1)  command1  ;;

pattern_2)  command2  ;;

...

...

*)  default_command    ;;

esac

 

pattern可以是这样的形式:0? | 1[0-1],前半部分0?代表00-09,后半部分1[0-1]代表10,11,|为或操作符

 

 

循环重定向

假设一个文件TEMP以:分隔,字段为title,author

IFS=":"

while read title author

do

......

done < TEMP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值