首页 > 代码库 > Linux shell编程基础笔记
Linux shell编程基础笔记
1.shell变量
本地变量:
a=1 (等号两边不能出现空格)
只读变量:
readonly 变量名=变量值 (在使用过程中不能更改)
声明变量:
linux给变量赋值时默认是字符或字符串型,如果需要数值运算,需要事先声明
declare 参数 变量名[=变量值]
declare的参数: -a:数组 -i:整型 -r:只读
设置整型变量,除了用declare -i声明以外,还可以:
a=$(($a+1)) or a=$[a+1]
清除变量:
unset 变量名(只读变量无法清除)
访问shell变量:
set 显示所有的本地定义的shell变量
${a} 取变量a的值
echo 显示变量
echo的参数:
无 不加参数打印完转换到下一行
-n 打印完不转换到下一行
从键盘读入为变量赋值:
read [参数] 变量名
read 变量名 变量名 变量名 ...
如果不跟变量名,则输入会赋给$REPLY
read参数:
-a 表示把输入存入数组变量名
-p 在赋值之前先显示-p后的提示字符串,如read -p"?" a 显示:?input
环境变量:
导出环境变量(可供外部调用):
export 变量名
位置参数变量:
当脚本被调用时用来保存脚本的命令行参数
echo ${1},${2},...
位置参数移位:
shift [前移量],默认前移1
如:
shift 2 向左移动两位,通常用在循环结构中
特殊变量:
$0:存放当前执行的脚本文件名,包括路径
$#:存放传递给脚本的位置参数的个数
$*:存放所有传递给脚本的参数
$@:和$*一样,但是每一个参数都用引号引起来
$$:存放当前的进程号
$!:存放后台运行的最后一个进程的进程号
$?:存放最后一个执行完的脚本或命令的退出状态 0表示成功,非0表示有错误
引用:
双引号:弱引用,对 $,`,\ 无效
单引号:强引用,任意特殊字符均被屏蔽
反斜线:转义
变量替换:
${varname:-word} 若varname未定义或空则用word代替varname作为返回值
${varname:=word} 若varname未定义或空则将word赋值给varname再返回
${varname:?message} 若varname未定义或空则将message作为错误信息输出
${varname:+word} 若varname已定义且不为空则用word作为返回值
${varname:offset} 将$varname中第offset个字符开始到结尾的字符串返回,取尾串
${varname:offset:length}将$varname中第offset个字符开始,长度为length的字符串返回,取子串
2.流程控制
顺序结构:
nothing to say
条件测试:
test命令
检查文件状态,判断字符串是否匹配,数值测试等操作
既可以用在分支结构中,又,可以用在循环结构中
test 测试条件
或
[ 测试条件 ](测试条件与左右方括号之间需要有一个空格)
文件测试
test [测试条件] FILE
-e 如果FILE存在
-s 如果FILE非空
-d 如果FILE是目录
-f 如果FILE是普通文件
-b 如果FILE是块设备文件
-c 如果FILE是字符设备文件
-S 如果FILE是套接字文件
-L 如果FILE是符号连接文件
-p 如果FILE是有名管道
-f 如果FILE具有读权限
-w 如果FILE具有写权限
-x 如果FILE具有执行权限
-G 如果FILE是被有效的组拥有
-O 如果FILE是被有效的用户所拥有
-k 如果FILE设置了sticky位
-u 如果FILE设置了set-user-id位
-g 如果FILE设置了set-group-id位
-N 如果FILE自上次访问以来被修改过
FILE1 -nt FILE2 如果FILE1比FILE2新
FILE1 -ot FILE2 如果FILE1比FILE2旧
FILE1 -ef FILE2 如果FILE1是FILE2的硬连接文件,二者指向同一个i节点
字符串测试
string1 = string2 字符串相等
string1 != string2 字符串不相等
-n string1 字符串非空
-z string1 字符串为空
数值测试
expr1 -eq expr2 表达式值相等
expr1 -ne expr2 表达式值不相等
expr1 -gt expr2 表达式1大于表达式2
expr1 -lt expr2 表达式1小于表达式2
expr1 -ge expr2 表达式1大于等于表达式2
expr1 -le expr2 表达式1小于等于表达式2
逻辑操作符
与 -a [ $a = "a" -a $b = "b" ] if($a=="a"&&$b=="b")
或 -o [ $a = "a" -o $b = "b" ] if($a=="a"||$b=="b")
非 ! [ ! a="a" ] if($a!="a")
分支结构:(if分支,case分支)
if分支结构:
if 条件测试1;then
条件测试1为真时的语句
[elif 条件测试2;then]
条件测试2为真时的语句
...
[else]
条件测试为假时的语句序列
fi
#如果条件测试语句与then在一行,那么要用;与then分隔开
#条件测试语句与if,elif,else,then之间至少要有一个空格分开
#elif,else可选,else只可出现一次
#if可以嵌套
case分支结构:
case 值 in
模式1)
语句组1
...
;;
模式2)
语句组2
...
;;
......
*)
语句组n
esac
循环结构
for循环:
for 变量 in 值1 值2 ... 值n
do
语句1
语句2
...
done
与c语言相似的格式
for((i=1;i<=6;i++))
do
...
done
while循环:
while 条件
do
语句1
语句2
...
done
select循环:
select name in [ in list ]
do
语句列表
done
3.shell函数
函数的定义:
function funcname
{
shell commands
}
or
funcname()
{
shell commands
}
参数的传递:
与脚本的参数相似,使用$1,$2...
如
#!/bin/bash
my_func()
{
a=$1
echo $a
}
read input
my_func() $input
函数的返回可以使用:
return