# Shell变量、数组、传参 ##
ฅ'ω'ฅ♪

Shell变量、数组、传参

创建

首先使用vi/vim创建文件

test.sh 扩展名不影响脚本执行

touch test.sh

!/bin/bash

echo "Hello World !"

!标记用于系统选择对应的解释器以执行脚本

echo用于向窗口输出文本

执行脚本

cd到脚本相应目录

chmod +x ./test.sh #执行权限 ./test.sh #执行脚本

如果直接写成test.sh,系统是会去PATH中寻找以执行的。

也可以直接运行解释器

/bin/sh test.sh
/bin/php test.php

变量赋值与使用

sentence="Hello world!"

  1. 变量名不需要加$(区分PHP)
  2. 变量名与等号之间不能存在空格。
  3. 使用英文字母、数字、下划线,首字符不能为数字
  4. 不能使用bash关键字(使用help以查看)

使用语句赋值

for file in `ls /etc`
错误:
var=1
var=$var+1
echo $var
会输出 1+1
正确:
1) let "var += 1"
2) var=$[$var + 1]
3) var='expr $var +1 '
num=2
错误
echo "the $numnd"
正确
echo "the ${num}nd"  ->the 2nd
echo "the {$num}nd"  ->the {2}nd

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。试图对只读变量进行更改,会报错。

删除变量

使用unset命令

不能删除只读变量

变量类型

运行shell时会同时存在三种变量

  1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串

能够应用变量和转义符,但是不能引用文本格式符(换行符以及制表符等)

单引号字符串的限制

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。
  2. 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  3. 单引号不能引用变量,不能引用转移符,也不能引用文本格式符(换行符以及制表符等)

双引号字符串

  1. 可以有变量
  2. 可以出现转义字符
  3. 能引用文本格式符
your_name="Ling"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果

hello, Ling! hello, Ling!
hello, Ling! hello, ${your_name} !

字符串操作

获取长度

string="Ling"
echo ${#string} #输出 4

截取子字符串

string="Hello world!"
echo ${string:1:4} # 输出 ello

查找字符串

string="Ling is is?"
echo `expr index "$string" io`  # 输出 1

数组

定义

array_name=(value0 value1 value2 value3)

可以不使用连续的下标,而且下标的范围没有限制。

读取数组元素值的一般格式是:

${数组名[下标]}

valuen=${array_name[n]}

使用 @ 或者*符号可以获取数组中的所有元素

echo ${array_name[@]}
或
echo ${array_name[*]}

获取数组长度

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

向shell脚本传递参数

脚本内获取执行脚本的第n个参数

$n

而$0为执行的文件名

echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

设置可执行权限并执行脚本

$ chmod +x test.sh 
$ ./test.sh 1 2 3
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
1.$#: 传递到脚本的参数个数;
2.$*: 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数
3.$$ 脚本运行的当前进程ID号
4.$! 后台运行的最后一个进程的ID号
5.$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n"的形式输出所有参数。
6.$- 显示Shell使用的当前选项,与set命令功能相同。
7.$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#!/bin/bash

echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

$* 与 $@ 有区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。当没有双引号时,二者没有区别

在为shell脚本传递的参数中如果包含空格,应该使用单引号或者双引号将该参数括起来,以便于脚本将这个参数作为整体来接收。

例:

read firstStr secondStr
echo "第一个参数:$firstStr; 第二个参数:$secondStr"
$ sh ./test.sh 
一 二 三 四
第一个参数:一; 第二个参数:二 三 四

实例:

read -p "请输入一段文字:" -n 6 -t 5 -s password
echo -e "\npassword is $password"

参数说明:
 -p 输入提示文字
 -n 输入字符长度限制(达到6位,自动结束)
 -t 输入限时
 -s 隐藏输入内容

实例:
$ sh test.sh 
请输入一段文字:
password is boogie
CANCEL

-评论-

Here you can post what you want to say, if you have more information please contact me by the following way.

-昵称-
-QQ-
-邮箱-
想说些什么?
-SUBMIT-

-电联 Phone-

+86 18520664652

-邮箱 Email-

boogieLing_o@163.com

boogieLing_o@qq.com

Your name. OS platform Browser model

What do you want to say?

created time

游說萬乘苦不早,著鞭跨馬涉遠道。

阿凌的貓爬架

幸會,

激活Ubuntu

转到“设置”以激活Ubuntu。

R0's board.