首页 > 系统相关 >shell常用操作

shell常用操作

时间:2023-02-22 20:56:47浏览次数:43  
标签:返回 常用 shell val echo file 字符串 操作 true

多行注释:
:<<EOF开头 EOF结束
字符串
name="sfsf"
echo "hello,${name}"# 可以无引号,单引号 双引号
echo -e "YES\nNo" # 开启转义
printf "%d %s\n" 1 "abc"
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出
printf "%s\n" abc def

单引号的特点
    单引号里不识别变量
    单引号里不能出现单独的单引号(使用转义符也不行),但可成对出现,作为字符串拼接使用。
双引号的特点
    双引号里识别变量
    双引号里可以出现转义字符
使用双引号拼接
    name2="black"
    str3="hello, "${name2}""; "hello ${name2}"
获取字符串长度
    text="12345"
    echo ${#text}
截取子字符串
    text="12345"
    echo ${text:2:2}
    # Output:
    # 34
    从第 3 个字符开始,截取 2 个字
	${string: start :length}	从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
	${string: start}	从 string 字符串的左边第 start 个字符开始截取,直到最后。
	${string: 0-start :length}	从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
	${string: 0-start}	从 string 字符串的右边第 start 个字符开始截取,直到最后。
	${string#*chars}	从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
	${string##*chars}	从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
	${string%*chars}	从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
	${string%%*chars}	从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
查找子字符串
    text="hello"
    echo `expr index "${text}" ll`
    # 3
    查找 ll 子字符在 hello 字符串中的起始位置

变量:
# 只读变量
readonly rword
unset dword # 删除变量
# 环境变量
$HOME $RANDOM...
数组:
bash 只支持一维数组,下标0
创建数组
# 创建数组的不同方式
nums=([2]=2 [0]=0 [1]=1)
colors=(red yellow "dark blue")
访问数组元素
访问数组的单个元素:
echo ${nums[1]}
# Output: 1
访问数组的所有元素:
echo ${colors[]}
# Output: red yellow dark blue
echo ${colors[@]}
在引号内,${colors[@]}将数组中的每个元素扩展为一个单独的参数;数组元素中的空格得以保留
访问数组长度
echo ${#nums[
]}
向数组中添加元素
向数组中添加元素也非常简单:
colors=(white "${colors[@]}" green black)
从数组中删除元素
用unset命令来从数组中删除一个元素:
unset nums[0]
拼接数组
拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下:
array_new=(${array1[@]} ${array2[@]})
运算符:
条件表达式要放在方括号之间,并且要有空格,例如: [$x==$y] 是错误的,必须写成 [ $x == $y ]
x=10
y=20
echo "x=${x}, y=${y}"
val=expr ${x} + ${y}
val=expr ${x} - ${y}
echo "${x} - ${y} = $val"
val=expr ${x} \* ${y}
echo "${x} * ${y} = $val"
val=expr ${y} / ${x}
echo "${y} / ${x} = $val"
val=expr ${y} % ${x}
echo "${y} % ${x} = $val"
if [[ ${x} == ${y} ]]
then
echo "${x} = ${y}"
fi
if [[ ${x} != ${y} ]]
then
echo "${x} != ${y}"
fi
关系运算符:
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
-eq;-ne
-gt -lt
-ge -le
if [[ ${x} -gt ${y} ]]; then
echo
布尔运算符:
!非运算
-o 或运算 ; ||
-a 与运算; &&
[ $a -lt 20 -a $b -gt 100 ]

字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为 0,为 0 返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为 0,不为 0 返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

文件测试运算符
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。为0代表true [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ]返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于 0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

if [[ ${x} > ${y} ]]; then
echo "${x} > ${y}"
elif [[ ${x} < ${y} ]]; then
echo "${x} < ${y}"
else
echo "${x} = ${y}"
fi

case 运算符
exec: shell 中的 exec 两种用法:
1.exec 命令 ;命令代替shell程序,命令退出,shell 退出;比如 exec ls
2.exec 文件重定向,可以将文件的重定向就看为是shell程序的文件重定向 比如 exec 5</dev/null;exec 5<&-

case ${oper} in
"+")
val=expr ${x} + ${y}
echo "${x} + ${y} = ${val}"
;;
"-")
val=expr ${x} - ${y}
echo "${x} - ${y} = ${val}"
;;
"*")
val=expr ${x} \* ${y}
echo "${x} * ${y} = ${val}"
;;
"/")
val=expr ${x} / ${y}
echo "${x} / ${y} = ${val}"
;;
)
echo "Unknown oper!"
;;
esac
每种情况都是匹配了某个模式的表达式。|用来分割多个模式,)用来结束一个模式序列。第一个匹配上的模式对应的命令将会被执行。
代表任何不匹配以上给定模式的模式。命令块儿之间要用;;分隔

循环语句:
for a in {1..10}
do
mkdir /datas/aaa$a
done

# for k in $( seq 1 10 )
# for k in $(ls $DIR)

for arg in elem1 elem2 ... elemN
do
    ### 语句
done
for (( i = 0; i < 10; i++ )); do
    echo $i
done
代码示例:
    DIR=/home/zp
    for FILE in ${DIR}/*.sh; do
        mv "$FILE" "${DIR}/scripts"
    done
while [[ ${x} -lt 10 ]]; do
    echo $((x * x))
    x=$((x + 1))
  done
  x=0
只要该条件为 假 就一直执行循环
    until [[ ${x} -ge 5 ]]; do
        echo ${x}
        x=`expr ${x} + 1`
    done
select循环
    select循环帮助我们组织一个用户菜单。它的语法几乎跟for循环一致:
    select answer in elem1 elem2 ... elemN
    do
      ### 语句
    done
    select会打印elem1..elemN以及它们的序列号到屏幕上,之后会提示用户输入。通常看到的是$?(PS3变量)。用户的选择结果会被保存到answer中。如果answer是一个在1..N之间的数字,那么语句会被执行,紧接着会进行下一次迭代 —— 如果不想这样的话我们可以使用break语句
    代码示例:
        PS3="Choose the package manager: "
        select ITEM in bower npm gem pip
        do
        echo -n "Enter the package name: " && read PACKAGE
        case ${ITEM} in
        bower) bower install ${PACKAGE} ;;
        npm) npm install ${PACKAGE} ;;
        gem) gem install ${PACKAGE} ;;
        pip) pip install ${PACKAGE} ;;
        esac
        break # 避免无限循环
        done

函数:
函数定义时,function 关键字可有可无。
函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
函数返回值在调用该函数后通过 $? 来获得。
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
[ function ] funname [()] {
action;
[return int;]
}

位置参数:
$0 脚本名称
$1 … $9 第 1 个到第 9 个参数列表
${10} … ${N} 第 10 个到 N 个参数列表
$* or $@ 除了$0外的所有位置参数
$# 不包括$0在内的位置参数的个数
$FUNCNAME 函数名称(仅在函数内部有值

函数处理参数
另外,还有几个特殊字符用来处理参数:
参数处理 说明
$# 返回参数个数
$* 返回所有参数
$$ 脚本运行的当前进程 ID 号
$! 后台运行的最后一个进程的 ID 号
$@ 返回所有参数
$- 返回 Shell 使用的当前选项,与 set 命令功能相同。
$? 函数返回值

shell扩展:
大括号扩展
大括号扩展让生成任意的字符串成为可能。它跟 文件名扩展 很类似,举个例子:
echo beg{i,a,u}n ### begin began begun
大括号扩展还可以用来创建一个可被循环迭代的区间。
echo {0..5} ### 0 1 2 3 4 5
echo {00..8..2} ### 00 02 04 06 08
命令置换
命令置换允许我们对一个命令求值,并将其值置换到另一个命令或者变量赋值表达式中。当一个命令被``或$()包围时,命令置换将会执行。举个例子:
now=date +%T
### or
now=$(date +%T)
echo $now ### 19:08:26
算数扩展
在 bash 中,执行算数运算是非常方便的。算数表达式必须包在$(( ))中。算数扩展的格式为:
在算数表达式中,使用变量无需带上$前缀:
当局部变量和环境变量包含空格时,它们在引号中的扩展要格外注

重定向
重定向让我们可以控制一个命令的输入来自哪里,输出结果到什么地方。这些运算符在控制流的重定向时会被用到:

Operator	Description
>	        重定向输出
&>	        重定向输出和错误输出
&>>	        以附加的形式重定向输出和错误输出
<	        重定向输入
<<	        Here 文档 语法
<<<	        Here 字符串

注意[]和expression之间的空格
test 和 [] 是等价的

shell文件包含
#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"

从命令行读取内容:
read -p "please input a number 1-4: " n

标签:返回,常用,shell,val,echo,file,字符串,操作,true
From: https://www.cnblogs.com/rnly/p/17145832.html

相关文章