欢迎访问我的博客,你的支持,是我最大的动力!

shell编程_代码片断

Linux 马从东 36℃ 评论
目录:
[显示]

脚本必须由 root 用户权限运行

系统可用的shell,cat /etc/shells

source script.sh 或 . script.sh (注意点.后有一空格),读入并执行脚本

sh<script.sh 或 cat script.sh|sh  也可执行脚本

常规变量字符串加双引号,且等号前后不能有空格
强引用(所见即所得)加单引号
命令的引用,用反引号
中括号两端至少要有一个空格

shell变量

环境变量:
TMOUT=3600 # 退出前超时时间
set 输出所有变量,包括全局和局部变量
unset 消除本地变量或环境变量
env 仅显示全局变量
declare 输出所有变量、函数、整数、已导出的变量

设置环境变量:
export 变量名=value
变量名=value ;export 变量名
declare -x 变量名=value

用户环境变量
/root/.bashrc /root/.bash_profile
全局环境变量
/etc/profile /etc/bashrc /etc/profile.d/

设置登录提示信息
/etc/motd  添加字符
/etc/profile.d/下放置脚本,不需要给执行权限

用户登录系统时,环境变量加载顺序:
/etc/profile -> /etc/profile.d/ -> $HOME/.bash_profile -> $HOME/.bashrc -> /etc/bashrc
非登录时,如手动执行 bash :
$HOME/.bashrc -> /etc/bashrc

把命令结果作为变量内容赋值:
变量名=ls
变量名=$(ls)

当变量后连接有其他字符串时,必须给变量加上大括号:
${dbname}_tname

awk 'BEGIN {print "'$ETT'"}'  # 注意 awk 中的用法非常特殊

/etc/init.d/functions 函数库

shell变量进阶

shell位置参数变量
从命令行、函数、脚本执行处传递参数

位置变量 说明
$0 获取脚本文件名
若执行脚本包含路径,则包括脚本路径
$n 获取第n个参数,n=1..9
若n>9,需使用大括号,${10}
$# 获取参数总个数
$* 获取所有参数,不加引号与$@相同
加引号 "$*" 表示将所有参数视为单个字符串,相当于"$1 $2 $3"
$@ 获取所有参数,不加引号与$*相同
加引号 "$@" 表示将所有参数视为不同独立字符串,相当于"$1" "$2" "$3"

echo \${1..15}

使用set设置位置参数
set -- "i am" handsome boy.
# -- 表示清除所有参数变量 重新设置后面的参数变量
# 设置了三个参数变量 可通过 $# $1 $2 $3 读取到
# for i;do echo $i;done -> for i in "$@";do echo $i;done  注意$@的双引号

shift 将位置参数移位(左移)

shell状态变量

状态变量 说明
$? 获取上一个指令执行状态返回值 0为成功
$$ 获取当前执行shell脚本的进程号 PID
$! 获取上一个在后台工作的进程的进程号 PID
$_ 获取之前执行的命令或脚本的最后一个参数

在脚本中,exit 数字,会返回该数字给 $?
在函数里,return 数字,会返回该数字给 $?

保证任务脚本只有一个实例在执行
当新脚本执行时,必须关闭未运行完或未退出的上一次同名脚本进程

shell内置命令
1、echo
参数:
-n 不换行输出
-e 解析转义字符,类似于 printf命令
2、eval
eval args
将args组合成一个新的命令并执行
3、exec
不创建子进程,执行指定的命令,执行完成后,进程(最初始的shell)终止
exec打开文件后,read命令每次都会将文件指针移动到文件下一行进行读取,直到文件末尾

4、read
从标准输入读取信息
5、shift
使变量左移 $2 -> $1

shell变量子串

表达式 说明
${parameter} 返回变量内容
${#parameter} 返回变量长度(按字符)
${parameter:offset} 返回offset开始到结尾的子串,offset值0表示完整串
${parameter:offset:length} 返回offset开始且长度为length的子串
${parameter#word} 开头开始删除最短匹配的word子串,必须从开头开始匹配,支持*通配符
${parameter##word} 开头开始删除最长匹配的word子串
${parameter%word} 结尾开始删除最短匹配的word子串,必须从结尾开始匹配,支持*通配符
${parameter%%word} 结尾开始删除最长匹配的word子串
${parameter/pattern/string} 使用string替换第一个匹配的pattern
${parameter//pattern/string} 使用string替换所有匹配的pattern

# 打印变量长度方法
# echo $OLDBOY|wc -L
# echo ${#OLDBOY}  速度最快
# expr length "$OLDBOY"   利用expr的length函数
# echo $OLDBOY|awk '{print length($0)}'  利用awk的length函数

shell特殊扩展变量

表达式 说明
${parameter:-word} parameter变量未定义或为空时,返回备用值word
${parameter:=word} parameter变量未定义或为空时,设置parameter值为word
${parameter:?word} parameter变量未定义或为空时,将word值作为标准错误输出
可捕捉由变量未定义而导致的错误
${parameter:+word} parameter变量未定义或为空时,什么都不做
parameter变量存在值时,使用word字符串替换变量的值
冒号:是可选的,表示为空,若没有:则仅判断未赋值(未定义)
变量的数值计算

++ -- 增加及减少,可前置也可放在变量结尾,位置表示了执行顺序
变量a在运算符前,输出表达式值为a,然后a自增或自减
变量a在运算符后,输出表达式会先自增或自减,表达式的值是自增或自减后的a的值

Shell常用算术运算命令

运算命令 说明
(()) 用于整数运算,效率很高
let 用于整数运算,类似于(())
expr 可用于整数运算,还有其他额外功能
bc 计算器程序,适合整数及小数运算
$[] 用于整数运算
awk 可用于整数运算,也可用于小数运算
declare 定义变量值和属性,-i参数可用于定义整形变量,做运算

((i=i+1)),运算后赋值,将i+1的值赋给i
i=$((i+1)),在双括号前加$,表示取运算结果
((8>7&&5==5)),可进行比较操作,结果1为真,0为假
echo $((2+1)),输出运算结果
myvar=99;echo $((myvar+1)),双括号中的变量可加$号也可以不加
双括号中的空格不影响,可有也可以没有

# 判断输入的字符串是否为数字
[ -n "echo $input|sed 's/[0-9]//g'" ]  判断字符串去掉数字后是否为空 -n 是否为空

let i=i+8 等同于 ((i=i+8)) 但后者效率更高

wget --timeout=5 --tries=2 http://www.baidu.com -q -O /dev/null

expr 用于计算
运算符及用于计算的数字左右都至少要有一个空格
expr做计算时,变量或字符串必须是整数,否则会报错,可以用这一特性判断字符串是否为整数(将一个未知的变量和一个已知的整数相加,看返回值)
expr 2 + 2
expr 2 \* 2    #星号需要转义
expr $1 + 1 >/dev/null 2>&1
expr $1 + 1 &>/dev/null

expr 判断文件扩展名是否符合要求
expr "$L_ID_FILE" : ".*\.pub$"
# 若$L_ID_FILE符合.pub结尾的格式,则$?返回值为0,否则返回值不为0

expr 计算字符串长度
expr length "$char"
# 其他方法
echo ${#char}
echo ${char}|wc -L
echo ${char}|awk '{print length($0)}'

bc 计算器
echo 3+5|bc
echo 3.3+5.5|bc   #支持小数计算
echo "scale=2;355/113"|bc  #保留两位小数

seq -s "+" 10
## 1+2+3+4+5+6+7+8+9+10
echo {1..10}|tr " " "+"

awk 实现计算
适合小数和整数,小数运算很精确
echo "7.7 3.8"|awk '{print ($1-$2)}'

$[] 运算
i=5;i=$[i+6];echo $i
echo $[4+5]

Shell 条件测试与比较

 

 

 

 

 

 

 

 

 

 

 

转载请注明:轻风博客 » shell编程_代码片断

喜欢 (0)or分享 (0)