首页 > 代码库 > shell基础笔记

shell基础笔记

变量

声明变量:
declare attribute variable
#attribute表示变量的属性,常见的属性如下:
# -i 将变量定义为整数;-a 变量声明为数组变量;-r 将变量声明为只读变量;-x 将变量设置成环境变量

局部变量:
在函数的内部通过local关键字定义局部变量,此外,函数的参数也是局部变量。作用域从被定义的地方开始,到函数的结束或被显示的删除,在函数外面使用局部变量会得到一个空值

全局变量:
可以在脚本中定义,也可以在函数中定义(不使用local关键字)。作用域从被定义的地方开始,一直到shell脚本结束或者被显示的删除

系统变量:
$n 表示传递给脚本的第n个参数
$0 当前脚本的名称
$# 命令行参数的个数
$? 前一个命令或者函数的返回状态码(也包括函数的返回值),执行成功返回0,否则,返回1
$* 以“参数1 参数2 参数3..”的形式返回所有参数的值
$@ 以“参数1”说“参数2”“参数3..”的形式返回所有参数的值
$$ 返回本程序的进程ID(PID)
$_ 保存之前执行的命令的最后一个参数

环境变量:
shell程序在运行时,都会接收一组变量,这组变量就是环境变量

#使用 set 命令列出所有的环境变量

PATH 命令搜索路径,以冒号为分隔符,当前目录不在系统路径里(这点与Windows不同)
HOME 用户主目录的路径名,是cd命令的默认参数
SEHLL shell的全路径名
PWD 当前的工作目录
HISTFILE 命令历史文件
LOGNAME 当前的登录名
TMOUT shell自动退出的时间,单位为秒,若设为0则禁止shell自动退出

变量赋值:
variableName=value

命令替换:
#指在shell程序中,将某个shell命令的执行结果赋给某个变量。
#在bash中,有以下两种语法可以进行替换
variableName=‘command‘
variableName=$(command)


#赋值号“=”的左右两边不能直接跟空格,否则shell会将其视为命令

引用变量:
${variableName}或$variable

间接变量引用:
var=name
name=John
${!var}与${name}的效果相同


清除变量:
unset variableName

特别注意:


单引号括起来的的字符都作为普通字符出现
双引号括起来的字符,除“$”“\”“‘”(单引号)和“"”(双引号)之外,其余字符作为普通字符对待
反引号括起来的字串被shell解释成命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号部分

------------------------------------------------------------------------------------------
条件测试(test命令和[命令):

#条件测试中的指定条件为真时,条件测试的返回值为0;为假时,返回值为非0值

#test命令
test expression

#[命令
#为了增强程序可读性,shell要求在条件表达式后面追加一个右方括号]来与前面的[的命令配对
#条件表达式与左右方括号之间必须都保留一个空格
[ expression ]

#如果expression是一个字符串,则 -n 判断字符串是否是非空;-z 判断字符串是否是空串,使用“=”和“!=”判断两个字符串是否相等

#如果expression是一个文件名,
#则 -e(或-a) 判断文件是否存在;-r、-w、-x判断文件是否存在,且是否可读、可写、可执行;-b、-c、-d、-L判断文件是否存在,且是否为块、字符目录、链接文件

#如果expression是一个由逻辑与、逻辑或、逻辑非构成的表达式,则 !表示逻辑非;-a 表示逻辑与;-o 表示逻辑或

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

if语句:

if expression
then
 statement1
 statement2
 ...
else
 statement3
 statement4
 ...
fi

或:
if expression
then
 statement1
 statement2
 ...
elif expression2
then
 statement3
 statement4
 ...
elif expression3
then
 statement5
 statement6
 ...
else
 statement7
 ...
fi


#在shell中,有一个特殊的命令,称为空命令,表示方法是一个冒号“:”,该命令不做任何事情,但是它的退出状态永远是0

exit语句:
#exit语句的基本作用是终止shell程序的执行,可带一个可选的参数,用来指定程序退出时的状态码
exit status

------------------------------------------------------------------------------------------
case语句:

case variable in
value1)
 statement1
 ...
 statement2;;
 
value2)
 statement3
 ...
 statement4;;
*)
 statement5
 ...
 statement6;;
esac

------------------------------------------------------------------------------------------
for循环:

for variable in {list}
do
 statement1
 statement2
 ...
done

#list是一个列表,可以是一系列数字或字符串,元素间用空格隔开,如果使用字符串做列表元素,则外面的大括号可以省略
# {1..8} 表示1-8的简写
# {1..100..5} 表示1-100间,从1开始,每次递增5,即1,6,11,16...
# ${arrayName[*]} 表示数组arrayName的全部元素


不带列表的for循环:

#shell从命令行获取条件列表,以下三种形式等价

for variable     for variable in $@    for variable in $*
do                    do                             do
 statement1        statement1                statement1
 statement2        statement2                statement2
 ...                       ...                               ...
done                done                         done

类C风格的for循环:

for ((expression1;expression2;expression3))
do
 statement1
 statement2
 ...
done

------------------------------------------------------------------------------------------
util循环:

util expression
do
 statement1
 statement2
 ...
done

------------------------------------------------------------------------------------------
while循环:

while expression
do
 statemnet1
 statement2
 ...
done

------------------------------------------------------------------------------------------
函数的定义:

function functionName()  
{
 statement1
 ...
}

#function可以省略

------------------------------------------------------------------------------------------
别名的设定与删除:

alias name="command"

unalias name

------------------------------------------------------------------------------------------
算数运算:

expr、$((...))、$[...]和let

#expr是一个shell命令,可以计算摸个表达式的值
expr expression

举例:
#先计算2和6的差,然后再乘以12,并把计算结果赋给变量result

#一定要注意运算符(幂运算“**”)左右的空格,且expr不能计算幂运算

result=`expr \( 2 - 6 \) \* 12`
result=$(( 1 + 2 ))
result=$[ 1 + 2 ]
let n=n + 1   (还是 let n=n+1  ?)

------------------------------------------------------------------------------------------
cat 查看文件内容:

cat fileName
# -n 显示文本的行号

cat -n fileName
# grep -n "" fileName和上一行的作用相同

---------------------------------------------------------------------------------
echo 输出文本

echo [options] string

#如果要输出的文本是由多个单词组成的,则可以使用双引号或者单引号将其引起来。
#如果不用引号引起来,则echo命令将一个字符串根据空格分割成多个字符串输出了

# -n 禁止echo语句执行完成后自动附加换行符
# 转义字符 \c 禁止继续输出文本

echo `command`
#echo可以将shell命令执行结果显示出来,且需要使用反引号将命令引用起来

#将echo命令显示的信息覆盖到目标文件中
echo string > fileName

#将echo命令显示的信息追加到目标文件的末尾
echo string >> fileName

------------------------------------------------------------------------------------------
rev 反转每行字符的顺序

rev [files]
#files表示要处理的文件的文件名列表,如果是多个文件,则文件名之间用空格隔开




shell基础笔记