shell零基础学习

1.入门

在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本,通常是如下两种
(1) #!/bin/sh
(2) #!/bin/bash
两者的区别联系:
在这里插入图片描述

	1.sh一般为bash的软链接
	2.sh调用执行脚本相当于打开了bash的POSIX标准模式
	3.#!/bin/bash --posix和#!/bin/sh效果差不多

执行shell脚本的方式通常有如下三种:

  1. bash file_name.sh
    /bin/bash file_name.sh

     [hadoop@hadoop001 shell_test]$ vi first.sh
     
     #!/bin/bash
     echo "www.baidu.com"
     
     [hadoop@hadoop001 shell_test]$ bash first.sh 
     www.baidu.com
    

    这种的好处在于,不用给shell脚本赋予可执行的权限

  2. /home/hadoop/shell/shell_test/file_name.sh(shell脚本绝对路径) 和 ./file_name

     [hadoop@hadoop001 shell_test]$ /home/hadoop/shell/shell_test/first.sh 
     www.baidu.com
    
     [hadoop@hadoop001 shell_test]$ ./first.sh 
     www.baidu.com
    

    这种执行方式需要赋予文件可执行权限

     [hadoop@hadoop001 shell_test]$ chmod +x first.sh
     [hadoop@hadoop001 shell_test]$ ll
     -rwxrwxr-x 1 hadoop hadoop 33 4月  10 20:50 first.sh
    
  3. source file_name.sh 或 . file_name.sh(注意**.**)

注:
1.shell脚本不一定全是.sh后缀,可用#对代码进行注释
2.假如使用sh命令执行脚本文件,可以没有chmod +x 和 第一行解释器#!/bin/bash,假如不是使用sh命令,那么需要chmod +x
3.从上到下一行行执行
4.#!/bin/bash -x可以进入debug模式
5.bash运行一个shell脚本,会在新的shell环境执行,source 执行脚本时,不会新开shell环境,能与当前终端共享shell环境,shell环境为一个终端

2.变量定义寄引用
	[hadoop@hadoop001 shell_test]$ vi variable.sh
	#!/bin/bash
	BAIDU=’www.baidu.com‘
	DATE=`date`
	
	echo ${BAIDU}
	echo ${DATE}
	[hadoop@hadoop001 shell_test]$ sh variable.sh 
	’www.baidu.com‘
	2019年 04月 10日 星期三 21:19:55 PDT

静态变量:
K=V ‘V’ “V” (‘V’, “V”区别在于,'is ${V}'不会解析V变量, "is ${V}"会解析V变量)
动态变量
K=V, V用``包起来

引用方式:
$K , ${K},区别在与当如下引用时
$KA, 会去解析KA变量
${K}A,会解析K变量然后与A拼接

	[hadoop@hadoop001 shell_test]$ cat variable.sh 
	#!/bin/bash

	BAIDU=’www.baidu.com‘
	DATE=`date`
	A="haha"
	B="xixi"
	echo ${BAIDU}
	echo ${DATE}
	echo $AB
	echo ${A}B
	echo ${A}${B}
	echo ${AB}
	echo ${#A}
	

   [hadoop@hadoop001 shell_test]$ bash variable.sh 
	’www.baidu.com‘
	2019年 04月 10日 星期三 21:32:54 PDT
	
	hahaB
	hahaxixi
	
	4
   echo $AB,echo ${AB}并没有正常输出

注:
1.变量名一般都会大写,只是约定俗成的习惯,好像用小写也没什么错
2.赋值=前后不能有空格
3.命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
4.中间不能有空格,可以使用下划线(_)。
5.不能使用标点符号。
6.不能使用bash里的关键字(可用help命令查看保留关键字)

3.参数传递
[hadoop@hadoop001 shell_test]$ vi parameter.sh
#!/bin/bash

echo $1
echo $2
echo "个数:$#"
echo "参数作为一个长字符串:$*"
echo "PID: $$"

[hadoop@hadoop001 shell_test]$ bash parameter.sh 

个数:0
参数作为一个长字符串:
PID: 4212

[hadoop@hadoop001 shell_test]$ sh parameter.sh 1 2
1
2
个数:2
参数作为一个长字符串:1 2
PID: 4224
4.数组(只支持一维数组)

bash不支持多维数组,没有限定数组的大小。

数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

	[hadoop@hadoop001 shell_test]$ vi array.sh
	#!/bin/bash

	arr=(beijing shanghai guangzhou chengdu shenzhen)
	echo ${arr[@]}						#输出数组全部内容
	echo ${arr[*]}						#输出数组全部内容
	echo ${arr[4]}						#输出索引下标为4的元素
	echo ${#arr[@]}					#输出数组的长度

   [hadoop@hadoop001 shell_test]$ sh array.sh 
	beijing shanghai guangzhou chengdu shenzhen
	beijing shanghai guangzhou chengdu shenzhen
	shenzhen
	5
4.if 判断
	[hadoop@hadoop001 shell_test]$ vi if.sh
	#!/bin/bash

	A="abc"
	B="bcd"
	
	if [ $A == $B ];then
	        echo "=="
	
	elif [ $A == "abc" ];then
	        echo "yep"
	else
	        echo "!="
	fi
	
	[hadoop@hadoop001 shell_test]$ sh if.sh 
	yep

注:
[ $A == $B ] ==左右必须有空格,和变量赋值时相反

5.循环(for and while)
	[hadoop@hadoop001 shell_test]$ vi forwhile.sh
	#!/bin/bash

	J=0
	for x in 1 2 3 4 5
	do
	        echo $x
	        let "J++"
	done
	
	echo $j
	
	echo "-----------------------------------------------"
	
	for ((i=1;i<10;i++))
	do
	        echo $i
	done
	
	echo "------------------------------------------------"
	
	X=0
	while(($X<10))
	do
	        echo $X
	        let "X++"
	done
	
	[hadoop@hadoop001 shell_test]$ sh forwhile.sh
	1
	2
	3
	4
	5
	
	-----------------------------------------------
	1
	2
	3
	4
	5
	6
	7
	8
	9
	------------------------------------------------
	0
	1
	2
	3
	4
	5
	6
	7
	8
	9

break.continue同样适用于shell脚本中的循环

6.分割
	[hadoop@hadoop001 shell_test]$ vi split.sh
	#!/bin/bash

	S="beijing,shanghai,guangzhou,chengdu,shenzhen"
	OLD_IFS="$IFS"
	IFS=","
	arr=($S)
	IFS="OLD_IFS"
	
	for x in ${arr[*]}
	do
	        echo $x
	done
	
	[hadoop@hadoop001 shell_test]$ sh split.sh 
	beijing
	shanghai
	guangzhou
	chengdu
	shenzhen
7.awk简单应用
	取数
	[hadoop@hadoop001 shell_test]$ vi awk.log
	a b c
	1 2 3
	4 5 6
	
	#打印列
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1}'
	a
	1
	4
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $0}'
	a b c
	1 2 3
	4 5 6
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1,$2}'
	a b
	1 2
	4 5
	
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk '{print $1 $2}'
	ab
	12
	45
	先打印第一列,再打印第二列
	
	#打印行
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk 'NR==1'     1为行号
	a b c

	按注定分隔符分拆分
	[hadoop@hadoop001 shell_test]$ vi awk.log
	a,b,c
	1,2,3
	4,5,6
	
	按照","分割并取第一列
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk -F "," '{print $1}'
	a
	1
	4
	
	按照","分割取第三列除第一行以外的元素
	[hadoop@hadoop001 shell_test]$ cat awk.log | awk -F "," 'NR>1 { print $3 }'
	3
	6

更多可以通过awk --help查看命令帮助来学习

8.sed简单应用
	[hadoop@hadoop001 shell_test]$ vi sed.log
	a b c a a
	1 2 3
	
	将开头的a替换成A
	[hadoop@hadoop001 shell_test]$ sed -i 's/a/A/' sed.log 
	[hadoop@hadoop001 shell_test]$ cat sed.log 
	A b c a a
	1 2 3
	
	将所有的a替换成A
	[hadoop@hadoop001 shell_test]$ sed -i 's/a/A/g' sed.log 
	[hadoop@hadoop001 shell_test]$ cat sed.log 
	A b c A A
	1 2 3

	每行行首拼接DD
	[hadoop@hadoop001 shell_test]$ sed -i 's/^/DD&/g' sed.log 
	[hadoop@hadoop001 shell_test]$ cat sed.log 
	DDA b c A A
	DD1 2 3

	每行行尾拼接DD
	[hadoop@hadoop001 shell_test]$ sed -i 's/$/&DD/g' sed.log 
	[hadoop@hadoop001 shell_test]$ cat sed.log 
	DDA b c A ADD
	DD1 2 3DD

同样也可以调用sed --help来查看帮助文档进行学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值