Shell笔记(1)
变量
1、变量类型
- 局部变量:在命令或脚本中定义,不能在其他程序访问。
- 环境变量:所有程序都能访问环境变量,必要时,shell脚本可以定义变量。
- shell变量:shell程序设置的特殊变量。可以是前两者。
2、变量命名规则
-
变量名与等号之间不能有空格
1、命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 2、中间不能有空格,可以使用下划线 _。 3、不能使用标点符号。 4、不能使用bash里的关键字(可用help命令查看保留关键字)。
-
变量赋值方法:
1、显式赋值: yourName="haha" 2、使用语句赋值:列出/etc 下文件名 for file in `ls /etc` for file in $(ls /etc)
3、使用变量
1、使用时加上 ${Var} 即可
例子:
${yourName}
2、定义过的变量可以重新赋值
4、Shell 字符串
1、单引号
单引号里面的任何字符都会原样输出。转义符也没用。就是说单引号里面没有变量。都是字符串。
str='heihei'
2、双引号
双引号里面可以有变量,可以出现转义字符。
例子:
your_name="qinjx"
* greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
上面* 的也正常输出。""不仅里面有变量,还可以对里面的双引号套娃理解。
运行shell脚本的两种方法:
./scriptName.sh
/bin/sh scriptName.sh 作为解释器参数运行
5、字符串操作
1、获取字符串长度: echo ${#strName}
2、提取字串:echo ${strName:1:4}
3、查找子字符串:String="alibaba is a great company" echo `expr index "$string" is`
注意使用的时 反引号 里面的双引号
* 含有指令的赋值,要用 `` 括起来 上面的 输出是 6
6、Shell 数组变量
-
bash shell 只支持一维数组,下表从0开始
-
数组元素用 空格或者换行 分开
集中定义:array_name=(value0 value1 value2) 单独定义:array_name[0]=val0
-
数组操作:
1、获取数组的元素: 单个:${array_anme[0]} 全部:${array_name[@]} 2、数组长度: 总长度:${#array_name[@]} ${#array_name[*]} 单个元素长度: ${#array_name[n]}
7、Shell 注释
只能单行注释
或者
{} q
参数传递
Shell 传递参数
-
执行脚本时,可以在命令后面添加参数。脚本内获取参数的格式为: $n n从0开始
-
$0 是文件名,实际参数还是从 1 开始
echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; 要添加执行权限 $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:test.sh 第一个参数为:1
1、参数处理符号
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以字符串形式显示所有参数 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程 ID |
$! | 后台运行的最后一个进程的 ID |
$@ | 与\(* 相同,但是使用时加"" ,并在引号中显示参数。如"\)@"用「"」括起来的情况、以"$1" "\(2" … "\)n" 的形式输出所有参数。 |
$- | 显示shell使用的当前选项,与 set 命令相同 |
$? | 显示命令最后退出状态。0表示没有错误 |
2、$* 和 $ @的区别
只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
*相当于传递了一个参数,@相当于多个
for i in "$*"; do
echo $i
done
输出:val0 val1 val2
-------------------------------------
for i in "$@"; do
echo $i
done
输出:
val0
val1
val2
数组
Shell 数组
- bash 数组只能是一维数组,初始化时不需要定义数组大小
- 下表从 0 开始
- 用()表示,中间用空格或者换行分开
1、数组的$* 和 $@
效果一直,不会换行。参数会换行。其他请参照shell 变量那一节操作。