首页 > 代码库 > 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