脚本开头
1
!/bin/bash
脚本开头,符号#!用来告诉系统它后面的参数是用来执行该文件的程序。本例子中我们使用/bin/sh来执行程序。
执行sh脚本
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 即赋予sh脚本权限
1
2bash
chmod +x filename或者
1
2#bash
sudo chmod 777 filename
执行脚本
./filename
或者source filename
输出信息到控制台
1
echo "hello sh"
退出当前shell
1
2exit 1
exit 0注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
1
print debug info
多行注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18:<<EOF
语句1
语句2
语句3
语句4
EOF
#也可以用其他符号,如下:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!但是貌似多行注释有一些问题,多行注释可以多行#来操作
1
2Note: on windows/cygwin, ANDROID_BUILD_PATHS will contain spaces
due to "C:\Program Files" being in the path.特殊符号
1
2
3
4
5用来替换命令
()
``
当前目录路径
`pwd`
变量
shell中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,您可以这样写:
1
2
3
4
5
6变量名=值 注意变量名和等号之间不能有空格
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash中的关键字
your_test="test"除了显式地直接赋值,还可以用语句给变量赋值,如:
1
2
3
4讲 /etc 下的目录文件名循环取出
for file in `ls /etc`
或
for file in $(ls /etc)使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
1
2
3
4变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
your_test="test"
echo $your_test
echo ${your_test}只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。改变了会报错
1
2
3!/bin/bash
myUrl="http://www.google.com"
readonly myUrl删除变量:使用 unset 命令可以删除变量。unset 命令不能删除只读变量。
1
unset variable_test
example:
1
2
3
4!/bin/sh
myUrl="https://skyxin888.github.io"
unset myUrl
echo $myUrl以上没有任何输出。
变量类型
- 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
字符串
shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
1
2
3
4
5
6
7
8
9单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
str='this is a string'
双引号里可以有变量
双引号里可以出现转义字符
your_name='Golden'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str #输出结果为:Hello, I know you are "Golden"!拼接字符串
1
2
3
4
5
6
7
8
9
10
11
12
13your_name="Golden"
使用双引号拼接
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, Golden ! hello, Golden !
hello, Golden ! hello, ${your_name} !获取字符串长度
1
2string="abcd"
echo ${#string} #输出 4提取子字符串
1
2
3以下实例从字符串第 2 个字符开始截取 4 个字符
string="Golden is a great site"
echo ${string:1:4} # 输出 olde查找子字符串
1
2
3查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)
string="Golden is a great site"
echo `expr index "${string}" io` # 输出 2字符串操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配
*是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分
file='/dir1/dir2/dir3/my.file.txt'
echo ${file#*/} # 去除第一个/以及左边的字符串 , 输出dir1/dir2/dir3/my.file.txt
echo ${file##*/}# 去除最后一个/以及左边的字符串,输出 my.file.txt
echo ${file#*.} # 去除第一个.以及左边的字符串 ,输出file.txt
echo ${file##*.}# 去除最后个.以及左边的字符串 ,输出txt
echo ${file%/*} # 去除最后/以及右边的字符串,输出 /dir1/dir2/dir3
echo ${file%%/*}# 去除第一个/以及右边的字符串,输出 空
echo ${file%.*}# 去除最后.以及右边的字符串,输出 /dir1/dir2/dir3/my.file
echo ${file%%.*}# 去除第一个。以及右边的字符串,输出/dir1/dir2/dir3/my
根据状态为变量赋值
- unset 例子.
unset a
- 空字符串, null 例子.
a=''
- 非空,即不是unset,并且不是空字符串 例子:
a=1 or a=b
等 - 冒号情况:
1 | := |
1 | = 号 测试代码 |
1 | - 号测试代码 |
1 | + 号测试代码 |