Shell---基础

一 基础

1、打印 echo

[root@docker2 test]# touch helloworld.sh
[root@docker2 test]# vim helloworld.sh 
[root@docker2 test]# cat helloworld.sh 
#!/bin/bash
echo Helloworld!!!!
[root@docker2 test]# sh helloworld.sh 
Helloworld!!!!


2、系统变量


[root@docker2 test]# echo $HOME
/root
[root@docker2 test]# echo $USER
root

3、用户定义变量

例子定义一个A变量并赋值为1


[root@docker2 test]# A=1    # ”=“ 等号两边不能有空格
[root@docker2 test]# echo A
A
[root@docker2 test]# echo $A   #需要带$
1
[root@docker3 pinpoint-docker]# unset A  
[root@docker3 pinpoint-docker]# echo $A

4、多命令、变量引入

例子 定义一个变量D并赋值字符串”I love Shell“

[root@docker2 test]# D="I love Shell"
[root@docker2 test]# vim helloworld.sh 
[root@docker2 test]# cat helloworld.sh 
#!/bin/bash
echo Helloworld!!!!  
echo $D
[root@docker2 test]# sh helloworld.sh 
Helloworld!!!!   
                   #没有显示D变量字符串内容
[root@docker2 test]# export D      #需要设置变量D
[root@docker2 test]# sh helloworld.sh 
Helloworld!!!!
I love Shell
[root@docker2 test]# 

备注 系统当前变量

[root@docker2 test]# export -p
declare -x D="I love Shell"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="docker2.changhongit.com"
declare -x LANG="en_US.UTF-8"
declare -x LC_ALL="en_US.utf8"
declare -x LC_CTYPE="en_US.utf8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"

5、特殊变量 $n

例子 代参数 执行命令 获取参数

(如hostname xxx.changhongit.com hostname为命令 xxx.changhongit.com为参数)

[root@docker3 pinpoint-docker]# touch par1.sh
[root@docker3 pinpoint-docker]# vim par1.sh 
[root@docker3 pinpoint-docker]# cat par1.sh 
#!/bin/bash

echo "$0 $1 $2 $3"
[root@docker3 pinpoint-docker]# sh par1.sh 
par1.sh   # 命令本身为$0
[root@docker3 pinpoint-docker]# sh par1.sh a 
par1.sh a  # 第一个参数为a
[root@docker3 pinpoint-docker]# sh par1.sh a b c
par1.sh a b c  # 第一个参数为a,第二个参数为b,第三个参数为c,

6、特殊变量 $#

$# 查看输入了多少参数,常用于循环


[root@docker3 pinpoint-docker]# vim par1.sh 
[root@docker3 pinpoint-docker]# cat par1.sh 
#!/bin/bash

echo "$0 $1 $2 $3"
echo "total $#"
[root@docker3 pinpoint-docker]# sh par1.sh a b c 
par1.sh a b c
total 3

6、特殊变量 $?

$? 上一条命令是否允许成功 0为成功


[root@docker3 pinpoint-docker]# tree
-bash: tree: command not found
[root@docker3 pinpoint-docker]# echo $?
127
[root@docker3 pinpoint-docker]# yum install tree
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
base                                                                                                               | 3.6 kB  00:00:00     
docker-ce-stable                                                                                                   | 3.5 kB  00:00:00     
extras                                                                                                             | 2.9 kB  00:00:00     
updates                                                                                                            | 2.9 kB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package tree.x86_64 0:1.6.0-10.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================================================
 Package                       Arch                            Version                                Repository                     Size
==========================================================================================================================================
Installing:
 tree                          x86_64                          1.6.0-10.el7                           base                           46 k

Transaction Summary
==========================================================================================================================================
Install  1 Package

Total download size: 46 k
Installed size: 87 k
Is this ok [y/d/N]: y
Downloading packages:
tree-1.6.0-10.el7.x86_64.rpm                                                                                       |  46 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : tree-1.6.0-10.el7.x86_64                                                                                               1/1 
  Verifying  : tree-1.6.0-10.el7.x86_64                                                                                               1/1 

Installed:
  tree.x86_64 0:1.6.0-10.el7                                                                                                              

Complete!
[root@docker3 pinpoint-docker]# echo $?
0


参数说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。如"$* "用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数
$$脚本运行的当前进程ID号
$@与$* 相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "2"…"2"…"n" 的形式输出所有参数
$-显示Shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

6、运算符

加减乘除、求余数

expr + - * / % 运算符两边需要空格

3+2=5

[root@docker3 pinpoint-docker]# expr 3 + 2
5




3-2=1

[root@docker3 pinpoint-docker]# expr 3 - 2
1

3*2=6

[root@docker3 pinpoint-docker]# expr 2 \* 3
6

9/3=3


[root@docker3 pinpoint-docker]# expr 9 / 3
3

10%3=1

[root@docker3 pinpoint-docker]# expr 10 % 3
1

混合运算

(3+2)*3=15


[root@docker3 pinpoint-docker]# expr `expr 3 + 2` \* 3
15



[root@docker3 pinpoint-docker]# s=$[(3+4)*5]
[root@docker3 pinpoint-docker]# echo $s
35

6.1 Shell (( )) 的用法

双小括号 (( )) 的语法格式为:
((表达式))

[root@jump shelldemo]# echo $((3+5))
8

7、条件判断

基本语法

[ condition ] (注意condition两边有空格)

条件非空即真, 返回 true或false

常用条件

两个整数之间比较

符合解释
=字符串比较
-lt小于(less than)
-le小于等于(less equal)
-eq等于(equal)
-gt大于(greater than)
-ge大于等于(greater equal)
-ne不等于(Not equal)

例子:判断5是否小于6,判断7是否小于6


[root@ngnix01 ~]# [ 5 -lt 6 ]
[root@ngnix01 ~]# echo $?
0
[root@ngnix01 ~]# [ 7 -lt 6 ]
[root@ngnix01 ~]# echo $?
1

按照文件权限判断

符合解释
-r有读的权限(read)
-w有写的权限(write)
-x有执行权限(execute
[root@ngnix01 ~]# ll
total 22832
-rw-------. 1 root root     1630 Oct 18 10:26 anaconda-ks.cfg
-rw-r--r--  1 root root   974241 Nov 23 00:28 atlassian-agent.jar
-rw-r--r--  1 root root      328 Nov 23 00:28 Dockerfile
-rw-r--r--  1 root root 22381786 Nov 23 14:21 fileshare.war
-rw-r--r--  1 root root      452 Nov 23 11:40 jira_proxy.conf
-rw-r--r--  1 root root     1366 Nov 23 14:34 nginx.conf
-rw-r--r--  1 root root     1130 Nov 23 08:09 nginx.conf.bak
[root@ngnix01 ~]# [ -w nginx.conf ]
[root@ngnix01 ~]# echo $?
0


按照文件类型判断

符合解释
-f文件存在并且是一个常规文件(file)
-e文件存在(existence)
-d文件存在并且是一个目录(directory)
[root@ngnix01 ~]# [ -f nginx.conf ]
[root@ngnix01 ~]# echo $?
0

多条件

[root@ngnix01 ~]# [ 9 -lt 8 ] && echo true || echo false
false
[root@ngnix01 ~]# [ 7 -lt 8 ] && echo true || echo false
true

8、流程控制

if 语句语法格式

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

例子

[root@ngnix01 ~]# cat ifDemo.sh 
#!/bin/bash

var1=$1

echo $var1

if [ $var1 -eq 1 ]
then
    echo "1"
elif [ $var1 -eq 2 ]
then
    echo "2"
else
    echo "other"
fi
 
[root@ngnix01 ~]# sh ifDemo.sh 1
1
1
[root@ngnix01 ~]# sh ifDemo.sh 2
2
2
[root@ngnix01 ~]# sh ifDemo.sh 3
3
other

for 循环

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:

for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

例子

[root@ngnix01 ~]# cat forDemo.sh 
#!/bin/bash


for i in 1 2 3 4 5
do
	echo $i
done

[root@ngnix01 ~]# sh forDemo.sh 
1
2
3
4
5

for ((初始化条件;循环控制条件;变量变化))
do
程序
done

for 例子2

[root@jump shelldemo]# sh fordemo1.sh 
5050
[root@jump shelldemo]# cat fordemo1.sh 
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do

s=$[$s+$i]

done

echo $s

case

case 语句和 if...elif...else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系

case 语句的语法如下:

case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,
值2")
如果变量的值等于值2,则执行程序2
…省略其他分支…

  • )
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac

例子:

[root@jump shelldemo]# cat menu.sh 
#!/bin/bash
 
#create by guoke
#function print menu
 
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
 
echo ' #使用echo打印菜单
#############################
 1.banana
 2.apple
 3.pear
 4.cherry
#############################
'
 
read -p "please select a num:" num
 
case "$num" in
     1)
     echo -e "${YELLOW_COLOR} banana ${RES}"
     ;;
     2)
     echo -e "${RED_COLOR} apple ${RES}"
     ;;
     3)
     echo -e "${GREEN_COLOR} pear ${RES}"
     ;;
     4)
     echo -e "${BLUE_COLOR} cherry ${RES}"
     ;;
     *)
     echo "please input {1|2|3|4}"
     sh menu.sh
esac

Shell while循环详解

while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。

Shell while 循环的用法如下:
while condition
do
statements
done

例子

[root@jump shelldemo]# sh whiledemo1.sh 
5050
[root@jump shelldemo]# cat whiledemo1.sh 
#!/bin/bash

i=1
sum=0
while ((i <= 100))
do
   ((sum+=i))
   ((i++))
done

echo $sum

9.Shell read命令:读取从键盘输入的数据

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

read 命令的用法为:
read [-options] [variables]

options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。

options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

[root@jump shelldemo]# sh readdemo1.sh 
Enter password in 20 seconds(once) > 
Enter password in 20 seconds(again)> 
Valid password
[root@jump shelldemo]# sh readdemo1.sh 
Enter password in 20 seconds(once) > 
Enter password in 20 seconds(again)> 
Invalid password
[root@jump shelldemo]# cat readdemo1.sh 
#!/bin/bash
if
    read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" &&  #第一次输入密码
    read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" &&  #第二次输入密码
    [ $pass1 == $pass2 ]  #判断两次输入的密码是否相等
then
    echo "Valid password"
else
    echo "Invalid password"
fi
[root@jump shelldemo]# 

10、Shell let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,读者已经学习了《Shell (())》,再学习 let 命令就相当简单了。

注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

Shell let 命令的语法格式为:
let 表达式

或者
let "表达式"

或者
let '表达式'

它们都等价于((表达式))。

[root@jump shelldemo]# a=10 b=20
You have new mail in /var/spool/mail/root
[root@jump shelldemo]# echo $((a+b))
30
[root@jump shelldemo]# echo let a+b
let a+b
[root@jump shelldemo]# let a+=6
[root@jump shelldemo]# echo $a
16
[root@jump shelldemo]# let c=a+b
[root@jump shelldemo]# echo c
c
[root@jump shelldemo]# echo $c
36

11、Shell函数详解(函数定义、函数调用)

Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。

Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。

Shell 函数定义的语法格式如下:
function name() {
statements
[return value]
}

[root@jump shelldemo]# cat functiondemo1.sh 
#!/bin/bash
#函数定义
function url(){
    echo "cpaas.changhongit.com"
}
#函数调用
url
[root@jump shelldemo]# sh functiondemo1.sh 
cpaas.changhongit.com

例子2

[root@jump shelldemo]# cat functiondemo2.sh 
#!/bin/bash
function getsum(){
    local sum=0
    for n in $@
    do
         ((sum+=n))
    done
    return $sum
}
getsum 10 20 55 15  #调用函数并传递参数
echo $?
[root@jump shelldemo]# sh functiondemo2.sh 
100

例子3

[root@jump shelldemo]# sh functiondemo2.sh 3 4 5
12
12
[root@jump shelldemo]# cat functiondemo2.sh 
#!/bin/bash
function getsum(){
    local sum=0
    for n in $@
    do
         ((sum+=n))
    done
    echo $sum
    return $sum
}
getsum $@
let a=$?
echo $a

12 debug模式

sh -x xxx.sh
set 方式设置开始debug和结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值