echo 命令用于向窗口输出文本(相当于C语言里的printf()。)
用echo命令时,不叫引号也可以。(图中的语句可写成 echo Hello World ! )
将代码写入一个后缀为sh文件。输入 sh+文件名 这一指令能运行该文件。
输入指令: sh filename.sh > file1
上面这个命令执行后,会将 filename.sh 的运行结果存入到file1文件中(若file1不存在,会自动创建)
任何file1文件内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,需要使用>>操作符。
运行指令: nohup sh main.sh &
能在同目录下生成一个 nohup.out 文件。main.sh 的运行结果会写入到nohup.out文件中。(缺点是nohup不能改,用的最多的是上面那个)
变量
#!/bin/bash
# 直接打印 Hello World !
echo "Hello World !"
# 使用变量的两种方式
your_name="GOOD"
echo $your_name
echo "I feel so ${your_name} today"
# 已定义的变量,可以被重新定义,如:
# 这样写是合法的,但注意,第二次赋值的时候不能写$your_name="jerry",使用变量的时候才加美元符
your_name="tom"
echo $your_name
your_name="jerry"
echo $your_name
#使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#下面的例子尝试更改只读变量,结果报错:
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
# 使用 unset 命令可以删除变量。语法:
# 变量被删除后不能再次使用。unset 命令不能删除只读变量。
unset variable_name
字符串
your_name="Tom"
qa="Hello, I know you are \"$your_name\"! \n"
#或者
qa1="Hello, I know you are \"${your_name}\"! \n"
echo -e $qa
>>输出结果为:
Hello, I know you are "runoob"!
双引号的优点:双引号里可以有变量;双引号里可以出现转义字符。
拼接字符串
# 拼接字符串
your_name="Tom"
h="Hello"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="${h},,,${your_name} !"
echo $greeting
echo $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2
echo $greeting_3
>>输出结果为:
hello, Tom !
Hello,,,Tom !
hello, Tom !
hello, ${your_name} !
获取字符串长度
string="abcdefg"
echo ${#string} #输出 7
提取子字符
以下实例从字符串第 3个字符开始截取3个字符:(注意:第一个字符的索引值为 0)
string="abcdefghijk"
echo ${string:3:3} #输出 def
查找子字符串
查找字符 s或 h 的位置(哪个字母先出现就计算哪个):(注意:这回又从1开始计数,而且查找的是字符,而不是字符串)
string="zhe shi yi duan pin yin"
echo `expr index "$string" sh` # 输出 2
数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 … 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
#还可以单独定义数组的各个分量:
#可以不使用连续的下标,而且下标的范围没有限制。
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
arr=(value0 valueww1 value2 value3)
# 输出下标为1的元素
echo ${arr[1]}
# 输出下标为1的元素的长度
echo ${#arr[1]}
# 输出数组的所有元素
echo ${arr[@]}
echo ${arr[*]}
# 输出数组的长度
echo ${#arr[@]}
>>输出结果
valueww1
8
value0 valueww1 value2 value3
value0 valueww1 value2 value3
4
do 和 done 相当于一对大括号。语法跟python相似。
#依次打印四个元素(元素两边不要加小括号,也不要加大括号)
for u in value0 value1 value2 value3
do
echo $u
done
遍历数组
#!/bin/bash
arr=(value0 value1 value2 value3)
for i in ${arr}
do
echo $i
done
echo "=========================="
for u in ${arr[*]}
do
echo $u
done
>>输出结果
value0
==========================
value0
value1
value2
value3
#!/bin/bash
arr=(12 36 '你好')
length=${#arr}
# for 遍历
for item in ${arr[*]}
do
echo $item
done
echo "========================="
# until遍历
until (( i++ > $length ))
do
echo ${arr[(( i-1 ))]}
done
echo "========================="
# for遍历
for (( k=0; k <= $length; k++ ))
do
echo ${arr[$k]}
done
echo "========================="
#while遍历
i=0
while (( i++ <= $length ))
do
echo ${arr[(( i-1 )) ]}
done
echo "========================="
>>输出结果
12
36
你好
=========================
12
36
你好
=========================
12
36
你好
=========================
12
36
你好
=========================
遍历连续数值
for j in {01..03}
do
echo $j
done
echo "=========================="
#变量赋值不能有空格
#starta=101不能写成 starta = 101
starta=101
enda=103
for u in `eval echo {${starta}..${enda}}`
do
echo ${u}
done
>>输出结果
01
02
03
==========================
101
102
103
注释
单行注释用井号(#)
多行注释还可以使用以下格式:
:<<EOF
注释内容
注释内容.
注释内容..
EOF
两个代码实例
打印目录下的文件名
# 注意是反引号(`),不是单引号(')
for file in `ls /home/hjy`
do
echo $file
done
或
for file in $(ls /home/hjy)
do
echo $file
done
两层for循环
#!/usr/bin
for mm in 11 12
do
for dt in {01..03}
do
echo "drop table if exists top_gn_2021${mm}${dt};"
done
echo "create table top_all_2021${mm}${mm}@@${mm}29 ======="
done
>>输出结果
drop table if exists top_gn_20211101;
drop table if exists top_gn_20211102;
drop table if exists top_gn_20211103;
create table top_all_20211111@@1129 =======
drop table if exists top_gn_20211201;
drop table if exists top_gn_20211202;
drop table if exists top_gn_20211203;
create table top_all_20211212@@1229 =======