1、shell脚本执行
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
输入一些代码,第一行一般是这样:
脚本在线运行
#!/bin/bash
echo "Hello World !"
运行脚本的方法:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注释脚本:EOF/!都可以
#!/bin/bash
:<<EOF
echo "Hello World !"
EOF
2、变量
2.1变量定义
没有空格
#!/bin/bash
your_name="runoob"
2.2使用变量
使用变量要加$
#!/bin/bash
your_name="runoob"
echo $your_name
echo ${your_name}
echo "my name is ${your_name}"
变量可以二次赋值:
#!/bin/bash
your_name="runoob"
echo $your_name
your_name="ava"
echo ${your_name}
2.2只读变量、删除变量
readonly 只读变量,无法修改变量的值
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
unset 删除变量
#!/bin/bash
myUrl="ava"
unset myUrl
echo $myUrl
无输出
2.2变量分类
字符串变量、整数变量、数组变量、环境变量、特殊变量。
字符串变量:
可以使用单引号 ’ 或双引号 " 来定义字符串。
获取字符串长度:变量为字符串时,${#string} 等价于 ${#string[0]}:
提取字符串:echo
s
t
r
i
n
g
:
1
:
4
查找字符
i
或
o
的位置
(
哪个字母先出现就计算哪个
)
:
e
c
h
o
‘
e
x
p
r
i
n
d
e
x
"
{string:1:4} 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):echo `expr index "
string:1:4查找字符i或o的位置(哪个字母先出现就计算哪个):echo‘exprindex"string" io` # 输出 4
#!/bin/bash
str1="ava"
str2="love"
name="wang"
res="${str1} ${str2} you ,\"${name}\"!" #\转义
echo $res
echo ${#res}
echo ${res:1:4}
echo `expr index "$res" io`
整数变量:
可以使用 declare 或 typeset 命令来声明整数变量。
#!/bin/bash
declare -i num=42;
echo $num;
数组变量:
数组可以是整数索引数组或关联数组。
#!/bin/bash
nums=(1 2 3 4 5)
declare -A asso_nums
asso_nums["name"]="Jhon"
asso_nums["age"]=30
echo ${nums[0]}
echo ${nums[@]}
echo "nums size:${#nums[@]}"
echo "sigel nums size:${#nums[1]}"
echo ${asso_nums[@]}
echo "asso_nums size:${#asso_nums[@]}"
echo "数组的键为: ${!asso_nums[@]}"
环境变量:
这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。
1,Shell编程常见系统变量如下:
(1)$0:当前脚本的名称。
(2)$n:当前脚本的第n个参数,n=1,2,…,9。
(3)$∗:当前脚本的所有参数(不包括程序本身)。(单字符串传递)
(4)$#:当前脚本的参数个数(不包括程序本身)。
(5)$?:命令或程序执行完后的状态,返回0表示执行成功。
(6)$$:程序本身的PID号。
(7)$!:后台运行的最后一个进程的ID号
特别注意!:$ 与 $@ 区别:*
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
#!/bin/bash
nums=(1 2 3 4 5)
echo ${nums[*]}
echo ${nums[@]}
#当用*传递的时候,是直接传入了整个数组(用一个参数表示),所以只获取参数1就行了
function showArr(){
arr=$1
for i in ${arr[*]};do
echo $i
done
}
#当用@传入的时候,多个参数传入,所以可以获取到全部参数以后再遍历
function showArr1(){
arr=$*
for i in ${arr[*]};do
echo $i
done
}
#整个数组以一个参数传入
showArr "${nums[*]}"
#整个数组传递多个参数
showArr1 "${nums[@]}"
不知道观察到没有,这里的数组传入的时候已经变形了,没有原来的下标了,比较坑。
**将数组作为参数传递给函数时,实际上是将数组元素转换成了字符串形式,并将它们作为命令行参数传递给函数。这意味着,数组的索引信息丢失了,数组元素不能再作为数组来访问和修改。**所以如果要对这个数组做操作的时候,需要重新给索引下标。
2,Shell编程常见环境变量如下:
(1)PATH:命令所示路径,以冒号为分割。
(2)HOME:打印用户家目录。
(3)SHELL:显示当前shell类型。
(4)USER:打印当前用户名。
(5)ID:打印当前用户ID信息。
(6)PWD:显示当前所在路径。
(7)TERM:打印当前终端类型。
(8)HOSTNAME:显示当前主机名。
特殊变量:
有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称,$1, 2 , 等表示脚本的参数。 2, 等表示脚本的参数。 2,等表示脚本的参数。#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。