Shell 基础语法

Shell 变量


一、定义变量
定义变量时,变量名不需要加美元符号($)。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
    命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    中间不能有空格,可以使用下划线(_)。
    不能使用标点符号。
    不能使用bash里的关键字(可用help命令查看保留关键字)。


二、使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可。


三、只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myUrl="http://www.baidu.com";
readonly myUrl;


四、删除变量
使用 unset 命令可以删除变量。
语法:
    unset variable_name;



五、Shell 字符串
1.字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
注意:
  单引号里的任何字符都会原样输出。
  双引号里可以有变量、转义字符。

2. 获取字符串长度
  string="abcd";
  echo ${#string};    #输出 4

3. 提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
  string="aa bb cc dd ee";
  echo ${string:1:4};     # 输出 a bb

4. 查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
  string="aa bb cc dd ee";
  echo `expr index "$string" b`  # 输出 4



六、Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

1. 定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。
定义数组的一般形式为:
    数组名=(值1 值2 ... 值n);
   
2. 读取数组
读取数组元素值的一般格式是:${数组名[下标]}。
例如:valuen=${array_name[n]};

使用@ 或 * 可以获取数组中的所有元素。
例如:echo ${array_name[*]};
         echo ${array_name[@]};

3. 获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同。
例如:
#取得数组元素的个数
length=${#array_name[@]}  
length=${#array_name[*]}

#取得数组单个元素的长度
lengthn=${#array_name[n]}    
    


七、Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,$0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
另外,还有几个特殊字符用来处理参数:
参数处理     说明
$#           传递到脚本的参数个数。
$*           以一个单字符串显示所有向脚本传递的参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,"*" 等价于 "1 2 3"(传递了一个参数)。  
$@         以一个单字符串显示所有向脚本传递的参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,"@" 等价于 "1" "2" "3"(传递了三个参数)。
$$           脚本运行的当前进程ID号。
$!            后台运行的最后一个进程的ID号。
$-           显示Shell使用的当前选项,与set命令功能相同。
$?          显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
 
 

八、Shell test 命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
1.数值测试
参数     说明
-eq     等于则为真
-ne     不等于则为真
-gt      大于则为真
-ge     大于等于则为真
-lt       小于则为真
-le      小于等于则为真

2.字符串测试
参数          说明
=          等于则为真
!=         不相等则为真
-z 字符串       字符串的长度为零则为真
-n 字符串       字符串的长度不为零则为真

3.文件测试
 参数       说明
-e 文件名     如果文件存在则为真
-r 文件名     如果文件存在且可读则为真
-w 文件名     如果文件存在且可写则为真
-x 文件名     如果文件存在且可执行则为真
-s 文件名     如果文件存在且至少有一个字符则为真
-d 文件名     如果文件存在且为目录则为真
-f 文件名     如果文件存在且为普通文件则为真
-c 文件名     如果文件存在且为字符型特殊文件则为真
-b 文件名     如果文件存在且为块特殊文件则为真



九、Shell 函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[ function ] funname [()]
{
    action;
    [return int;]
}



十、Shell 输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下:
命令              说明
command > file       将输出重定向到 file。
command < file       将输入重定向到 file。
command >> file     将输出以追加的方式重定向到 file。
n > file           将文件描述符为 n 的文件重定向到 file。
n >> file         将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m          将输出文件 m 和 n 合并。
n <& m          将输入文件 m 和 n 合并。
<< tag           将开始标记 tag 和结束标记 tag 之间的内容作为输入。




十一、/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
 注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。



十二、Shell 文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename   # 注意点号(.)和文件名中间有一空格

source filename



   

原文地址:https://www.cnblogs.com/sunziying/p/9601337.html