Fork me on Gitee

shell编程入门1

初步尝试

#!/bin/bash

# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir test
touch test.txt
echo "hello,world" > test.txt
cat test.txt
cd ..
# 整个目录删除
rm -rf test
[root@master project]# sh second1.sh
hello,world

优化:将test.txt和test目录用变量代替

#!/bin/bash

DEPLOY_DIR=test
USE_FILE=test.txt
# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir DEPLOY_DIR
touch USE_FILE
echo "hello,world" > USE_FILE
cat USE_FILE
cd ..
# 整个目录删除
rm -rf DEPLOY_DIR

优化:创建test失败的场景 ,默认 set +e命令遇见错误会继续执行,set -e遇见错误,停止运行

优化:使用外部传入文件目录

#!/bin/bash

# 默认 set +e命令遇到错误会继续执行,set -e 遇到错误,停止运行
#set -e

if [ $# -eq 1 ]
then
    DEPLOY_DIR=$1
fi

if [ $# -eq 2 ]
then
    USE_FILE=$2
fi

DEPLOY_DIR=test
USE_FILE=test.txt
# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir DEPLOY_DIR
touch USE_FILE
echo "hello,world" > USE_FILE
# cat USE_FILE
echo "输出${USE_FILE}文件的内容...":
cd ..
# 整个目录删除
rm -rf DEPLOY_DIR

echo

#!/bin/bash

echo "hello,     world"
echo hello,  world ,       你好
[root@master project]# sh echo.sh
Hello    World
hello, world, 你好

第一行 会保留空格,原样输出,输出内容用引号

第二行会保留一个一个空格后,去掉多余的空格

var1="a b    c   d"
echo $var1
echo "$var1"
a b c d
a b    c   d

echo常用选项

  • -n不带默认的换行

    # 默认输出的最后会有一个换行符
    echo "hello"
    # 不要加上默认的换行符
    echo -n "hello"
    
hello
hello[root@master project]#

举例:在同一行中接收输入参数

echo -n "Please input your name: "
read name
echo "Hello, $name"

会接收键盘输入,并输出hello xxx

  • -e:解释字符串中出现的转义符
echo -e "hello\nwor\tld"
  • echo输出带颜色的字符,31me为红色,32为绿色,33为黄色,34为蓝色
echo -e "\033[31mhello \033[0m"
echo -e "\033[32mhello \033[0m"
echo -e "\033[33mhello \033[0m"
echo -e "\033[34mhello \033[0m"

var

#!/bin/bash

var1=hello
echo $var1

var1_xyz=abc

# 期望输出heelo,xyz
echo "输出\$var1_xyz=$var1_xyz"

实际会输出abc,将代码改造为${var1}_xyz

echo "继续输出${var1}_xyz"

就可以输出heelo,xyz

declare

declare显示指定类型

  • -i 指定整形
  • -r 只读变量
  • -a 指定数组
  • -f 指定函数名
declare -i var3

var3=xyz
echo "\$var3=$var3"

输出结果为0, 0为默认值。

var3=245
echo "\$var3=$var3"

输出245

declare -r var4=abc
var4=xyz
echo $var4

输出报错,只读数据,不允许赋值

declare会输出系统的变量

[root@master project]# var1=xyz
[root@master project]# declare | grep 'var1'
var1=xyz

declare > /dev/null # 输出系统中定义的变量,包括系统变量

set

# declare 同义命令set
unset var1 #清除变量var1
declare | grep 'var1'

执行后为空,已清除var1的值

# ``:反引号 $():获取里面的Linux命令的执行结果
LOCAL_IP=`cat /etc/hosts | grep \`hostname\` | awk '{print $1}'`
LOCAL_IP_OTHER=$(cat /etc/hosts | grep `hostname`  | awk '{print $1}')

echo  "\$LOCAL_IP=$LOCAL_IP,\$LOCAL_IP_OTHER=$LOCAL_IP_OTHER"

输出$LOCAL_IP=172.16.1.100,$LOCAL_IP_OTHER=172.16.1.100

array

#!/bin/bash

arr1=(xxx xyz "hello,     world"  1234  20.0)

# 获取数组的长度
echo "数组arr1的长度:${#arr1[@]}"
[root@master project]# echo "数组arr1的长度:${#arr1[@]}"
数组arr1的长度:5
# 如果没有指定下标,默认为index[0]的元素,
echo ${arr1}
xxx
# index为1的元素 第二个元素
echo ${arr1[1]}
xyz


# 最后一个元素
end_len=${#arr1[@]}
end_index=`expr $end_len - 1`
echo ${arr1[$end_index]}

第二个定义数组的方式

arr2[0]=abc
arr2[1]=xyz
arr2[2]="世界 你好"
arr2[3]=1234

echo "arr2数组的内容:$arr2{2[@]}"
echo "arr2数组的长度:${#arr2[@]}"

arr2数组的内容:abc xyz 世界 你好 1234

arr2数组的长度:4

遍历数组

# 常用的遍历数组的方式
for i in `seq 0 $end_index`
do 
   pos=`expr $i+1`
   echo "arr2中第${pos}位置的元素为:${arr2[$i]}"
done

count=1
for ele in "${arr1[@]}"
do
   echo "arr2中第${count}位置的元素为:$ele"
   count=`expr $count + 1`
done

function

#!/bin/bash
xyz(){
    echo "hello function xyz"
}

xyz
hello function xyz
# 向定义的函数传参。位置参数
xyz_with_params(){

	echo "函数传递的参数个数为:$#"
	for i in `seq 1 $#`
	do
			echo "第${i}个位置参数为:$1"
			shift
	done
}

xyz_with_params abc xyz 124

使用shift参数向前移动,打印结果为

[root@master project]# sh func.sh
函数传递的参数个数为:3
第1个位置参数为:xxx
第2个位置参数为:yyy
第3个位置参数为:zzz

带返回值

# 函数里的返回值
xyz_with_return(){
    echo "函数返回值为1000"
    return 1000
}
xyz_with_return
echo "函数返回值为:$?"
函数返回值为1000
# 函数返回值介意0~255
函数返回值为:232

可以与if/else绑定

if xyz_with_return
then
    echo "函数执行成功"
else
    echo "函数执行失败"
fi

此处由于函数返回的$?!=0,执行else中的逻辑

"函数执行失败"

compute计算

#!/bin/bash

a=`expr 2 + 3`
echo $a

运行结果: 5

b=`expr $a+10`
echo "$a + 10= $b"

5 + 10 = 15

c=`expr $a\* 10`
echo "$a * 10=$c"

5 * 10 = 50

d=`expr $c / 3`
echo "$c / 3= $d"

50 / 3 = 16

e=`expr $c % 3`
echo "$c % 3= $e"

50 % 3= 2

let

let "a+=10"
echo "a+10=$a"

a+10=15

let "a/=10"
echo "a=$a"

a=1

# 自增操作
let "a++"
echo "a++=$a"

a++=2

var b=67
((b++))
echo "b自增后的值$b"

((b%=10)) 
echo "取余10后,b的值为$b"
b自增后的值68
取余10后,b的值为8

浮点计算, 需要依赖bc命令

yum -y install bc
# 浮点计算,bc命令,设置scale小数点后的位数
echo "scale=2;1.2*1.1+0.22" | bc

1.54

str字符

#!/bin/bash
var1=xxxxxxxbc123212zy
echo "变量var1的长度${#var1}"

变量var1的长度17

var2="中文字符"
echo "变量var2的长度${#var2}"

变量var2的长度4

# 截取字符串,与py的含义不一样
echo "去掉前面两个字符:${var1:2}"

去掉前面两个字符:xxxxxbc123212zy

# 切片
echo "从第5个字符开始,连续取三个字符:${var1:5:3}"

从下标第5个字符开始,连续取三个字符:xxb

# 删除某个子串 #、##、%、%%分别表示从前面删除、从前面删除到最后一个、从后面删除、从后面删除到第一个
echo "从左边删除最小匹配,结果为:"${var1#x*b}

xxxxxxxbc123212zy

从左边删除最小匹配,结果为:c123212zy

# 只替换第一个的结果
echo "替换bc字符串结果为:${var1/bc/BC}"

替换bc字符串结果为:xxxxxxxBC123212zy

# 替换全部的结果
echo "替换所有的x字符串结果为: ${var1//x/X}"

替换所有的x字符串结果为: XXXXXXXbc123212zy

echo "从头开始匹配替换,结果为:${var1/#xxx/你好}"

从头开始匹配替换,结果为:你好xxxxbc123212zy

echo "从尾部开始匹配替换,结果为:${var1/%zy/你好}"

从尾部开始匹配替换,结果为:xxxxxxxbc123212你好

echo "变量var3的值:${var3-xyz}"

变量var3的值:xyz

echo "变量var3的值:${var3:-xyz}"

变量var3的值:xyz

两种赋默认值的区别是

var3=
echo "变量var3的值:${var3-xyz}"

输出变量var3的值:

var3=
echo "变量var3的值:${var3:-xyz}"

输出变量var3的值:xyz

:xyz, 不管结果是否为空,只要变量定义即输出对应变量值,而:-abc只要变量为空,就会设置默认值

var4=123
#只有变量var4赋值后,默认值生效.如果var4定义为空,也会生效
echo "变量var4的值:${var4+xyz}"
echo "变量var4的值:${var4:+xyz}"
var5=
# 问号后面跟错误信息,如果var5没有定义,则报错退出,并提示定义的错误信息
echo "变量var5的值:${var5?"请输出var5的变量值"}"
[root@master project]# var5=
[root@master project]# echo "变量var5的值:${var5?"请输出var5的变量值"}"
变量var5的值:
[root@master project]# echo "变量var6的值:"${var6:?"请输入var的变量值"}
-bash: var6: 请输入var的变量值
posted @ 2025-02-11 23:01  shine-rainbow  阅读(23)  评论(0)    收藏  举报