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 变量那一节操作。