shell下多行注释 :<<! !
:<<! begin
多行注释
第二行
!
ed的使用
#删除5-10行以及16-20行。
#!/bin/bash
ed $1<<EOF
16, 20d
5,10d
w
q
EOF
\ls #可以忽略alias的指定参数
dos2unix 文件格式转化
read -s #不显示读取
select 变量 in 关键字集
do
交互式执行
done
shift 参数左移 $# -1 以供参数大于9个的处理
sh -x 显示过程
-n 查询语法错误
-v 执行前会先输出脚本本身内容
sh 脚本 要求对所在目录有rx 对脚本有r(绝对路径运行要有rx权限)
export PS4='+${LINEN0}' 可以shell -x 的跟踪过程中显示行号
截取一段调试,在脚本中写如下
set -x 此处开启调试
set +x 关闭调试
直接运行就要可以
变量以字母和下划线开头
${#array[@]} 变量字符串长度
unset array 删除整个数组
unset array[4] 删除单个数组元素
数组的定义
array=(25 80 100 90)
array=([1]=one [2]=two [3]=three)
array[0]=a array[1]=two array[1]=three
declare -a array
array=($(ls))
echo ${array[0]}
echo ${array[@]} 输出全部
echo ${#array[@]} 输出数组元素个数 或者 ${#array[*]}
echo ${#array[@]:3:5} 第三个开始提取5个
echo ${#array[@]/5/6} 第五个改写成6 临时生效,实际数组不变
echo ${line:0:1} 字符串截取,从字符串line中截取从第0个到第1个字符
形式 | 如果设置了 var | 如果没有设置var |
---|---|---|
${var:-string} | $var | string |
$ {var:+string} | string | null |
${var:=string} | $var | string(并且执行var=string) |
${var:?string} | $var | (返回string然后退出) |
在此,冒号“:”在所有运算表达式中事实上均是可选的。
- 有"
:
" === 运算表达式测试“存在”和“非空” - 没有"
:
" === 运算表达式仅测试“存在”
[tom@ton ~]$str='25 80 100 90'
[tom@ton ~]$echo $str
25 80 100 90
[tom@ton ~]$echo ${str#* }
80 100 90
[tom@ton ~]$echo ${str##* }
90
[tom@ton ~]$echo ${str% *}
25 80 100
[tom@ton ~]$echo ${str%% *}
25
调试脚本
#!/bin/bash -r 受限模式
set -r 写在脚本中也是受限模式
写循环时可以写sleep以免占用过多系统资源
set -x
需要调度代码
set +x
dirname 与 basename 配合处理路径
脚本结尾要unset 变量
reset 变量重新初始化
unset 函数名 取消加载的函数
脚本函数
$0 仍然父脚本名称
return 是退出函数
函数传参是从$1开始的
declare 声明变量
- 给变量设定类型属性
+ 取消类型属性
-i int型
-x 环境变量
-p 显示变量声明类型
# 执行$() 命令相于当开启子shell运行()中的内容
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.8.0_251/bin:/root/bin
路径讲究先后顺序的
export PATH=$PATH:/tmp 将tmp目录加入path
想要先访问tmp,此时可以
export PATH=/tmp:$PATH
-d file #file存在且是一个目录则返回True.
-f file #如果file存在且是一个普通文件则返回True.
-w file #如果file存在且可写则返回True.
-x file #如果file存在且可执行则返回True.
filel -nt file2 #如果filel比file2新则返回True。(指修改日期)
filel -ot file2 #如果file1比file2旧则返回True。(指修改日期)
filel -ef file2 #如果两者是相同的设备和具有相同的结点(inode)数则返回True.
-z str #如果str长度为零则返回True。
-n str #如果str长度为非零则返回True.
str1 ===== str2 #如果字符串相等则返回True。
str1 === str2 #如果字符串相等则返回True。
(使用"=="代替"="符合严格意义上的 POSIX兼容)
str1 !== str2 #如果字符串不相等则返回True.
str1 < str2 #如果str1排在str2之前则返回True (与当前位置有关)。
strl > str2 #如果str1 排在str2之后则返回True(与当前位置有关)。