Shell 学习笔记(一)

  • 变量
  • 字符串
  • 拼接字符串
  • 获取字符串长度
  • 提取子字符
  • 查找子字符串
  • 数组
  • 遍历数组
  • 遍历连续数值
  • 注释
  • 两个代码实例
  • 打印目录下的文件名
  • 两层for循环


echo 命令用于向窗口输出文本(相当于C语言里的printf()。)

用echo命令时,不叫引号也可以。(图中的语句可写成 echo Hello World ! )

shell脚本echo输出不到文件 shell echo输出到文件_字符串


将代码写入一个后缀为sh文件。输入 sh+文件名 这一指令能运行该文件。

shell脚本echo输出不到文件 shell echo输出到文件_数组_02

输入指令: sh filename.sh > file1

上面这个命令执行后,会将 filename.sh 的运行结果存入到file1文件中(若file1不存在,会自动创建)

任何file1文件内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,需要使用>>操作符。

shell脚本echo输出不到文件 shell echo输出到文件_shell脚本echo输出不到文件_03

运行指令: nohup sh main.sh &

能在同目录下生成一个 nohup.out 文件。main.sh 的运行结果会写入到nohup.out文件中。(缺点是nohup不能改,用的最多的是上面那个)

shell脚本echo输出不到文件 shell echo输出到文件_字符串_04

变量

#!/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 =======