shell-2

#!/bin/bash 开头指定shell
找到脚本:要不给定路径如./test.sh,要不在PATH下
echo:默认输出后有换行符,-n 输出后不换行
$ {var}: 用于变量定界,比如$HOMEa 改为 ${HOME}a
echo “$15” $1未定义,只能输出5,echo “$15” 输出$15,\转义了
$() 或`` 表明执行里面的命令,然后可将命令输出赋值给变量
输出重定向 >(覆盖) >>(追加)
输入重定向 < <<(内联)
command << marker(任意字符串)
data
marker
管道 |
运算:
1 expr 1 + 3 ,expr对空格要求严格(左边的就有3个空格),expr作为命令,tt= $(expr 2 + 3),注意tt=右边无空格,这里为了显示方便
2 $[] :如tt= $[1+2],空格要求不严格,tt=右边无空格
3 上面2方法只能整数运算,若要小数,bc命令
退出状态码:0为成功,大于0小于等于255失败,echo $? 查看上个命令(脚本)退出状态码,shell脚本以最后一个命令的退出状态码退出,exit 30 (以30退出)

if command
then 
 commands
fi

if command;then
commands
fi

if command
then
commands
elif command
then 
commands
else
commands
fi

要点:if和elif后面是command,根据command的退出状态码决定是否执行then的代码,else就没有command和then,别忘了fi
test和[]: 都是command,注意空格,可放入字符串如test $var来判断 $var 是否有值(长度不为0),也可三类比较
数值比较:比较符为字母,-eq -ne -ge -gt -le -lt 如 if [ $var -lt 3 ] ,只能处理整数
字符串比较:比较符为符号字母,= != >(需转义为/>,否则容易认为是重定向,采用ASCII顺序,ASCII顺序中大写字母ASCII值小,而我们普通比较是用的本地化语言设置,本地化中大写字母在后面,更大) <(转义,ASCII) -n(长度不为0) -z(长度为0,未定义或空字符串)
文件比较:-d -f -e -r -w -x -s(存在并非空,文件中有数据) -O(当前用户是否是file的属主) -G(当前用户的默认组是否是file的属组) -nt(左创建时间相对右更晚,更新) -ot(左更旧)
&& 和 || : 连接两个test或[]命令,如&&表明两个命令退出状态码都为0最终退出状态码才为0,if才执行
(( )): 是个命令,里面是数学表达式,如赋值,如比较(>),比较不成立命令的退出状态码不为0
[[ ]] :是个命令,字符串比较,模式匹配,可正则,if [[ $var == r* ]]
case: | * ;; esac

case $var in
at | bt)
  echo "ab";;
ct)
echo c;;
*)
echo d;;
esac

如下,一般空格分隔,考虑单引号或双引号(比如New York这样需要把空格包括进来),单词存在单引号如don’t考虑\转义或者"don’t"

for var in aa bb
do
echo $var
done

var=aa
var=$var’ b’ // 可进行连接
可以for var in $list for var in $(cat file) for var in /home/rich/* (文件扩展匹配,注意文件或路径名中可有空格, $var最好加双引号)
IFS(内部字段分隔符,一般为换行,空格,制表符),决定了for分隔(尤其在for var in $(cat file)很重要),修改IFS可以进行特殊处理

IFS=$'\n' \\改为只有换行,先行分隔,再空格分隔
for entry in `cat file`
do
echo "entry $entry"
IFS=' ' \\改为只有空格
for value in $entry
do
echo $value
done
done

C语言风格扩展
for((a=1,b=2;a<3;a++,b–)) 在这里(())不是命令了,bash进行C语言风格的for循环
while: do/done 后面接command ,可接多个命令(换行分隔),所有命令都成功才do
until: do/done 后面接command ,可接多个命令(换行分隔),所有命令都成功才不do
break 2 代表跳出2层循环
continue 2 代表2层循环的这一次都跳过
done > aa.txt 或 done | sort 可对输出重定向或sort

$后面:0程序名(/home/rich/test.sh ,basename 可以改为test.sh) 数字(第几个参数,大于等于10加{},否则怎么区分$10还是$1和0) #(参数个数) ,if [ -n “$1” ] 确保参数存在,参数可能有空格,加双引号

 最后一个参数值: ${$#} 是错误的,应该是${!#}

@和* :都是表达所有的参数,echo 结果一样,@是看做独立的,星号是看做整体,for循环如果不加双引号(错误,处理不了带有空格的参数,以echo的值进行for),加双引号(@可取出所有参数,星号只循环一次作为整体取出)
所以一般 for var in “$@”
shift 左移变量 shift 2 左移两次 ($1 $# 都会改变)
处理选项:简单选项,选项带有值(参数),普通参数
那么-- 作为选项和普通参数的交界点,case处理
getopt:选项可以混合如-ab,怎么处理,getopt ab: -ab test test1 输出-a -b test -- test1
冒号表明带值的选项 ,shell中set – 来替换命令行参数,如下,然后再case判断

set -- $(getopt ab: "$@")

getopt处理不了带空格或引号的参数
getopts: 强大,可处理带空格参数,-atest 也能解析成-a test

while getopts :a:b opt //首个冒号表明去掉错误信息,后面冒号表明带值的选项 ,将命令行参数的选项放入opt变量,如-a那么$opt为a,-d那么$opt为?(匹配不到就是?), 没有选项了(只有参数)getopts返回非0,退出while,处理参数
 do
case "$opt" in
a)
echo "a option $OPTARG";; //带值的选项 ,值放在OPTARG变量
b)
echo "b option";;
*)
echo "wrong $opt";;
esac
done
echo $OPTIND // OPTIND保存了现在的处理位置,目前OPTIND指向第一个参数的位置,左移OPTIND-1
shift $[$OPTIND-1]
echo $@

read var : 读取输入流给var变量赋值,换行符(输入enter)结束,-p 提示信息,-t 超时时间,-s 表明隐藏读取,你看不到屏幕输入,没有指定var则保存在REPLY变量中,-n1 ( -n 1) 表明输入1个字符自动结束,而不是等到输入enter,read var1 var2(可能可以一次读入多个变量,自己实践有问题)

    cat file|while read line //读取文件,反复执行read line命令,读完一行(读到换行符)命令结束,返回0,进入do,读取不到数据命令返回非0
    do
    echo $line
    done

task_struct内的files_struct:含file对象数组,数组下标(索引)为文件描述符(从0开始)
进程最多可含9个文件描述符,0号描述符即为STDIN描述符,1为STDOUT,2为STDERR,
进程总是从0(STDIN)描述符所指向的位置读取输入,普通输出到1描述符指向的位置,错误输出到2描述符指向的位置
0文件描述符默认指向位置为键盘输入,1和2默认为显示器输出

描述符重定向:即关联一个新的位置,描述符-定向符号-新的位置

定向符号:>  >>(追加)  <  <>(输入加输出)
描述符:数字,输出重定向没有默认为1,&代表1和2,输入重定向没有默认为0
新的位置:比如文件,也可以&1代表1描述符指向的位置
exec 1>aa.txt  //在脚本中进行永久重定向,对后面的命令都生效,在单个命令后的重定向只对单个命令有效
exec 1>&-  关闭描述符 
echo bb >/dev/null // 丢弃普通输出

lsof:列出打开的文件描述符,指定进程
mktemp:创建临时文件或临时目录(-d), 文件或目录在/tmp目录下,

mktemp test.XXXX // 创建文件,X位置会生成任意字符替换,命令输出文件名,-t 选项后命令输出文件路径

tee:date|tee test.txt 将输入发往STDOUT和test.txt两处,默认覆盖文件,-a 追加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值