shell编程基础

这篇博客介绍了Shell编程的基础知识,包括变量解析(全局变量、局部变量和特殊变量)、控制语句(if、for、while、until及case选择语句),数组的使用以及函数的创建。详细讲解了环境变量的定义与作用,以及在定义变量时如何正确使用单引号和双引号。此外,还涵盖了Shell中条件判断的各种操作和数组的应用。
摘要由CSDN通过智能技术生成

1.

指定脚本类型

#!/bin/bash

修改权限,给others增加执行权限

chmod o+x xxx.sh

两条语句写在一行要加分号,无论是脚本还是命令行

2. 变量解析

shell编程中,变量分为全局变量(系统变量)、局部变量(本地变量)和特殊变量(shell专有)
参考

全局变量

即环境变量,可以在配置文件中定义和修改,也可以在命令行中设置,注意在命令行中的修改在该终端关闭时就失效了,用于临时定义某环境变量。若要永久修改环境变量,在配置文件/etc/profile,/etc/bashrc,/etc/profile.d,~/.bashrc等文件中修改。

环境变量:指定一个目录,运行软件或程序的时候,相关程序会按照目录寻找相关文件

常见系统环境变量

TMOUT:设置自动退出的误操作等待时间
HOSTTYPE:系统文件系统类型
HISTSIZE:历史命令记录条数
HOME:用户登录时进入的目录,家目录
UID:当前用户的id
SHELL:当前shell解释器
PWD:当前所在路径(每改变一次目录,该值就会改变)
PATH:可执行文件默认路径

自定义环境变量(临时的)

# export TEST1 = sugar              # 1. export 变量名=value
# TEST2 = bunny; export TEST2       # 2. 变量名=value;export 变量名
# declare -x TEST3 = what           # 3. declare -x 变量名=value
# env | grep TEST
TEST1=sugar
TEST2=bunny
TEST3=what

局部变量

本地变量只在创建它们的shell脚本中使用,环境变量可以在创建它们的shell脚本及其派生出来的子进程中使用。

a=12345
b=12345-$a
c='12345-$a'
d="12345-$a"
echo b c d
结果:
12345-12345
12345-$a
12345-12345

单引号与双引号的区别在于:单引号内若存在变量,存在的变量当做字符串不会被解析,原样输出;而双引号中若存在变量,该变量会被解析出其具体的值再加入到字符串中。
①不加引号可以直接定义内容包含数字、字符串、路径名等,适合定义数字
②单引号适合于纯定义字符串,
③而双引号适合于字符串的内容中包含有变量的内容的定义。
(习惯:数字以及不带空格的简单字符串不加引号,其它长的特别是有空格的字符串加双引号;遇到“ 变 量 名 ” , 但 不 想 解 析 的 加 单 引 号 , 但 一 般 出 现 都是为了解析变量,所以单引号较少使用)

注意在awk中单引号和双引号反过来了。

cmd=$(date +%F)    //由于`date +%F`的反引号不容易辨认,就不太使用`date +%F`
tar -zcf code_$(date+ %F)_kang.tar.gz /etc //没有问题
tar -zcf code_`date +%F`_kang.tar.gz /etc   //没有问题
tar -zcf code_kang_$cmd.tar.gz /etc    //没有问题
tar -zcf code_$cmd_kang.tar.gz /etc	//会有歧义,因为系统会不清楚是应该解析$cmd还是cmd_kang
tar -zcf code_${cmd}_kang.tar.gz /etc  //不会有歧义

特殊变量

$0             # 当前程序的名称
$n             # 当前程序的第n个参数,n=1,2,...,9
$*             # 当前程序的所有参数(不包括程序本身)
$#             # 当前程序的参数个数(不包括程序本身)
$?             # 命令或程序执行完后的状态,一般返回0表示执行成功,用来判断上个命令是否执行成功。0表示运行成功,2表示权限拒绝,1~125为运行失败原因是脚本命令、系统命令错误或参数传递错误,126为找到该命令但是无法执行,127为无该命令/程序,>128表示命令被系统强制结束
$@				# 获取当前程序的所有参数,与$*的区别是,前者将命令行的每个参数视为单个字符串,后者将所有参数视为一个字符串
$$                # 获取当前的shell进程号
$UID           # 当前用户的id
$PWD           # 当前所在目录

echo -e '\033[32mTHERE IS YOUR TXT\033[0m'  # 颜色,感兴趣可以自己搜索

这里写链接内容

3. 控制语句

if

这里写链接内容
参数详解

格式:
if [ expression 1 ]     # [  ]中expression前后两个空格很关键
then
sentence 1              # 缩进可有可无
elif [ expression 2 ]; then  # then也可以连在if后面,多个分号
    sentence 2
else
sentence 3
fi                      # 结束if
例子:
NUM=100
if (($NUM > 4));then       # 两个括号,不然会认为 >和 < 是重定向
    echo "this number is greater NUM"
fi

对比字符串只能使用==、<、>、!=、-z、-n。对比字符串时,末尾一定要加上x(或者a、b等)一个字符,因为if [ 1x=="ab"x]x 1 x ==" a b " x ] 时 如 果 没 有 了 x , 并 且 1是”“,这个语句会翻译成if [ == “ab” ],左边相当于没有东西了,会报语法错误。或者使用[[ ]],就不需要x了。使用<或者>时,如果是用[ ],需要用转义符”\”,如>。

对比数字使用既能使用-eq、-ne、-gt、-ge、-lt、-le,也能使用==、<、>、!=。其中-eq的意思是equal,-ne是unequal,-gt是greater than,-ge是greater than or equal to,-lt是less than,-le是less than or equal to。
if [[ 100 -gt 85 ]]

判断目录是否存在if [ -d /data/xy ] or if [ ! -d /data/xy ]
文件是否存在

FILES=/data/xy/information.txt
if [ -f $FILES ];then
    echo "ok" >> $FILES 

常用参数:
文件/目录判断:
字符串判断
数值判断
逻辑判断
IF高级特性:
常用例子:

for

这里写链接内容

for 变量 in 名字表
do
    命令
done

for PID in $killid
do
        /bin/kill -9 $PID 2> /dev/null
done

for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday
do
        echo "today is : $DAY"
done

j=0
for ((i=1;i<=100;i++))
do
    j=`expr %i + %j`
done

for file in $(ls *.sh)  
do  
echo $file is file path \! ;  
done  

while

这里写链接内容

while [ expression ]
do
    command
done

while read line
do
    echo $line
done </etc/hosts

until循环

相当于c语言的do while

until [ expression ]; do
    command
done

case选择语句、select选择语句

case $arg in 
    case1)
    command 1
    ;;
    case2)
    command 2
    ;;
    *    )
    command 3
    ;;
esac
select i in 1 2 3
do
    echo $i
done

4. 数组

这里写链接内容

nums = (1 2 3 4)
echo ${nums[0]}

5. 函数

参考
参考

hello()    ## 函数定义
{
        echo "Hello there today's date is `date +%Y-%m-%d`"
        # return  2      ###返回值其实是状态码,只能在[0-255]范围内
}   
hello #函数调用
echo $?  #获取函数的return值,就是获取上一个命令的状态码,如果return 2没有注释,就是获取return 2 命令的状态吗。  
echo "now going to the function hello intsmaze"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值