shell学习笔记---(语法篇四·完结)

本文介绍了Shell脚本的基础知识,包括数组操作、文件与输入输出重定向、HereDocument的使用、信号处理及文件包含等内容。通过示例展示了如何创建和使用数组、执行文件操作以及进行输入输出的重定向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

. 数组相关操作
. shell与文件
. shell输入与输出重定向
. Here Document
. shell与信号
. shell文件包含
. shell运算符

# 数组:数组中可存放多个值(只支持一维)                          
# 初始化时不需要定义数组大小,并且没有限定数组的大小            
# 下标从0开始,下标可以是整数或算术表达式,其值大于等于0        
# shell数组用括号表示,元素用空格分割开,可以不使用连续的下标   
# 并且下标的范围没有限制                                        
# 语法格式:arr_name=(value1 value2...valuen)                   
# 或者:                                                        
# arr_name[0]=""                                                
# arr_name[1]=""                                                
# arr_name[10]=""                                               
# ...                                                           
# 读取数组指定元素值的一般格式为:${arr_name[index]}            
arr=(1 a 3.14 'A' "string")                                   
echo "0:${arr[0]}"                                            
echo "1:${arr[1]}"                                            
echo "2:${arr[2]}"                                            
echo "3:${arr[3]}"                                            
echo "4:${arr[4]}"                                            
# 获取数组中的所有元素                                          
arr=(1 a 3.14 'A' "string")                                   
echo ${arr[@]}                                                
echo ${arr[*]}                                                
# 获取数组的长度                                                
arr=(1 a 3.14 'A' "string")                                   
echo ${#arr[@]}                                               
echo ${#arr[*]}                                               
# 遍历数组                                                      
# 方式1:                                                       
arr=(1 a 3.14 'A' "string")                                   
for (( i=0;i <${#arr[@]};i++ ))                               
do                                                            
    echo "$i -> ${arr[i]}"                                    
done                                                          
# 方式2:                                                       
arr=(1 a 3.14 'A' "string")                                   
for i in ${arr[@]}                                            
do                                                            
    echo $i                                                   
done                                                          
# 我们在前面也说过shell中的数组下标可以是不连续的               
# 假如我们在数组中添加一个元素arr[7],没有下标为5,6的元素       
# 这个时候我们使用方式1是是不会访问到下标为7的元素的            
# 解决办法:推荐使用方式2                                       

# shell与文件:大多数UNIX系统命令从我们的终端接受输入           
# 并将所产生的输出发送回我们的终端。一个命令通常从一个          
# 叫标准输入的地方读取输入,默认情况下,这恰好是我们的终端      
# 同样,一个命令通常将其输出写入到标准输出,默认情况下          
# 这也会是我们的终端                                            

# shell输出重定向:                                             
echo "hello world" > file                                     
for i in {1..3}                                               
do                                                            
    echo "haha $i"                                            
done > file                                                   
# shell追加重定向                                               
echo "hello world" > file                                     
for i in {1..3}                                               
do                                                            
    echo "haha $i"                                            
done >> file                                                  

# shell输入重定向                                               
# 只能读文件中的一行                                            
read line < file                                              
echo $line                                                    
# 可按行读取整个文件的内容                                      
while read line                                               
do                                                            
    echo $line                                                
done < file                                                   
# 给每行添加一个字符串,并且备份到另外一个文件中                
while read line                                               
do                                                            
    echo 'YES '$line                                          
done < file >> file2                                          

# 默认情况下。command > file将stdout重定向到file                
# command < file将stdin重定向到file                             
# stderr重定向到file:                                          
# 2表示标准错误文件(stderr)                                   
find aaaaa 2> file  # 重定向                                  
find bbbbb 2>> file  # 追加重定向                             
# 注意这里的 2> 是一个整体,2和>之间不能有空格                  
# 如果要将stdout和stderr合并后重定向到file,可以这样写:        
# command >> file 2>&1                                          
find / -name shell2.sh > out 2>&1                             

# Here Document:是一种特殊的重定向方式                          
# 用来将输入重定向到一个交互式shell脚本或程序,基本形式:       
# command << delimiter                                          
#         document                                              
# delimiter                                                     
# 作用:将两个delimiter之间的内容(document)作为输入传递给command
# 结尾的delimiter一定要顶格写,前后不能有任何字符,包括空格和tab
# 开始的delimiter前后的空格会被忽略掉                           
# 统计EOF之间有多少行string                                     
wc -l <<EOF                                                   
    aaaa                                                          
    bbbb                                                          
    cccc                                                          
EOF                                                           
# 使用Here Document生成Makefile文件                             
cat <<EOF > Makefile                                          
test:test.c                                                   
        gcc -o test test.c                                    
.PHONY:clean                                                  
clean:                                                        
        rm -f test                                            
EOF                                                           

# /dev/null:如果希望执行某个命令,但又不希望                    
# 在屏幕上显示输出结果,可将结果重定向到/dev/null               
# 该文件是一个特殊的文件,写入到他的内容都会被丢弃              
# 不会从该文件中读到任何内容,但是有用的是会有禁止输出的效果    
# 如果希望屏蔽stdout和stderr可以这样写:                        
find / -name shell2.sh > out 2>&1 > /dev/null                 

# shell与信号,常见处理方式如下:                               
# trap 'commands' signal-list:当脚本收到signal-list             
# 清单列出的信号时,trap命令会执行引号中的命令                  
trap 'echo "hello"; ls' 3                                     
while :                                                       
do                                                            
    :                                                         
done                                                          
# trap signal-list:trap不指定任何命令,接受信号的默认操作       
# 默认操作是结束进程的运行                                      
# trap '' signal-list:trap命令指定一个空命令串,允许忽视信号    

# shell文件包含:使用 . 和 source                               
. api.sh                                                      
source api.sh                                                 
read d1 d2                                                    
res=$(intAdd $d1 $d2)                                         
echo $res                                                     
# 新建一个文件写以下函数                                        
# function intAdd()                                             
# {                                                             
#     let data=$1+$2                                            
#     echo $data                                                
# }                                                             

# shell运算符                                                   
# echo                                                          
# 显示字符串                                                    
echo "hello"  # 可省略双引号                                  
echo hello                                                    
# 显示换行                                                      
echo -e "hello! \nworld"                                      
# 显示不换行                                                    
echo "hello!\c"                                               
echo "world"                                                  
# printf:使用printf的脚本比使用echo的移植性好                   
# printf使用引用文本或空格分割的参数,外面可以在printf          
# 中使用格式化字符串,还可以定制字符串的宽度,左右对齐方式等    
# 默认printf不会像echo自动添加换行符,可手动添加\n              
mystring='string'                                             
myint=100                                                     
myfloat=3.14                                                  
printf "%s:%d:%f\n" $mystring $myint $myfloat                 

# 产生一个随机数                                                
echo $RANDOM 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值