首页 > 系统相关 >shell编程

shell编程

时间:2024-05-01 17:55:05浏览次数:19  
标签:字符 shell word 变量 编程 echo offset var

!/bin/bash

set -u -e 安全

export 环境变量 cat /porc/$PID/export

位置变量
$0: 表示脚本或命令本身的名称。
$1, $2, $3, ...: 表示第一个、第二个、第三个等参数的值。
$* 或 $@: 表示所有位置参数的列表。
$#: 表示传递给脚本或命令的位置参数的个数。

echo $[12^4] =8 异或

条件 表达式 描述
可读 [[ -r "$file" ]] 检查文件是否可读。
可写 [[ -w "$file" ]] 检查文件是否可写。
可执行 [[ -x "$file" ]] 检查文件是否可执行。
存在 [[ -e "$file" ]] 检查文件是否存在。
目录 [[ -d "$file" ]] 检查文件是否是目录。
文件 [[ -f "$file" ]] 检查文件是否是普通文件(非目录、非设备文件等)。
符号链接 [[ -L "$file" ]] 检查文件是否是符号链接。
以某用户为所有者 [[ -O "$file" ]] 检查文件是否以某用户为所有者。
以某用户为所属组 [[ -G "$file" ]] 检查文件是否以某用户为所属组。
文件大小是否大于零 [[ -s "$file" ]] 检查文件大小是否大于零。
条件 表达式
相等 [[ $a == $b ]]
不相等 [[ $a != $b ]]
大于 [[ $a -gt $b ]]
大于等于 [[ $a -ge $b ]]
小于 [[ $a -lt $b ]]
小于等于 [[ $a -le $b ]]
逻辑与 [[ $a && $b ]]
逻辑或 [[ $a
死循环

(cd /data; umask 666; touch 2.txt) 再下个进程执行,不影响当前环境
{} 反之,在当前环境下执行

num ="zz yy yy" 定为一行
echo $num
num ="
ll
zz
l1
"
echo "$num"
nums="echo {1..10}"

for循环
for i in {xxx};
do
循环
done
例子:for i in {1..100};
do let sum+=i;
done;
for ((sum=0;i<100;i++));
do
let sum+=i;
done

while循环
循环控制中断循环 conuntion
循环控制退出循环 break
while CONDITION
do
循环体
done

例子:while true do
循环体
done

while read url;do
crul $url &>/dev/null |echo "$url is faild"
done <url.txt

df | sed -En '/^/dev//s#.* ([0-9]+)%.*#\1 \2#p'|while read DISK USE; do
循环体
done

until循环 while的反
until commant ;do commant done
until false ;do commant done

位置参数

bash test.sh bb zz bb ee

选择循环
selcet menu in bb zz ll ; do echo $menu;done
$ps1:影响颜色
$ps3:用于select循环中的提示符

funtion 函数调用
local 变量 本地变量,将变量定在了函数体内
return 返回会退出函数
exit 直接退出脚本

func1 () {
函数体
}

func1 (函数调用)

阶层
image
假设$1=3,3进入循环,$-1,所以进入2的循环,2进入1的循环,返回1,21退出2阶层到3,所以是12*3

bomb() {bomb|bomb &}; bomb
调用bomb,并在后台运行

trap
image
trap "finish" exit 当出现exit时,确保执行finish

数组
定义:
emp[0]=zz
emp[1]=zz1
emp[2]=zz2
title=("e" e1 e2)
num=({1..10})

关联数组(自定义数组)
declare -A 数组 使用关联数组需要先定义
emp[frist]=l1
emp[second]=l2

删除
unset num[2]

调用
echo ${title[]} 显示全部 @显示数组下标 ${#num[@]} 加#显示下标总数
echo ${num[@]:3:4} 跳过3个输出4个
echo ${url#
/} #懒惰模式 找到第一个/输出 ##贪婪模式
echo ${url%
/} %反向检索 %%贪婪模式
echo ${url/33/44} 替换
echo ${url/33} 删除

遍历数组
for i in ${emp[*]};do echo $i ;done

基于偏移量取字符串

返回字符串变量var的字符的长度,一个汉字算一个字符
${#var} 
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset} 
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length
前空格,并且length必须大于offset
${var: -length:-offset}

基于模式取子串

 其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字
符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
从var变量的值中删除以word开头的部分
${var#word}
同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var##word}
##################################################################################
其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 
删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一
个word为界删右留左
${var%word*}
${var%word}
同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向
左的最后一个word为界删右留左
${var%%word*}
${var%%word}

高级变量

高级变量用法-有类型变量

  • Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是等价的
  • declare [选项] 变量名
    -r 声明或显示只读变量
    -i 将变量定义为整型数
    -a 将变量定义为数组
    -A 将变量定义为关联数组
    -f 显示已定义的所有函数名及其内容
    -F 仅显示已定义的所有函数名
    -x 声明或显示环境变量和函数
    -l 声明变量为小写字母 declare –l var=UPPER
    -u 声明变量为大写字母 declare –u var=lower

eval 间接引用
eval会进行两次扫描,先替换$n,然后再输出
image

x=y
y=zz
devl echo $$x 或 echo ${!x}

标签:字符,shell,word,变量,编程,echo,offset,var
From: https://www.cnblogs.com/civetcat/p/18089247

相关文章

  • 五个重要的编程原则让你写出高质量代码
    Therearefiveprinciplesthatyoushouldconform.1:Singleresponsibilityprinciple.各司其职,一个对象不要封装的太复杂,设计的时候要考虑好哪些功能属于这个对象,不要将一个对象弄得太复杂,当你意识到一个对象承担了太多责任的时候,尝试分开它,减小耦合度,以便维护。2:Open-Clo......
  • C#的基于.net framework的Dll模块编程(五) - 编程手把手系列文章
          这次继续这个系列的介绍: 一、使用DLL类库的方法;1)静态类;先引用该类库,然后声明命名空间,然后就能够进行使用了。   2)动态类;先引用该类库,然后声明命名空间,然后能够进行使用了。  3)窗体;只能在Winf......
  • [好物推荐] 编程字体推荐
    推荐一些编程中使用的功能性字体1.中英文混合字体写代码的注释更好看,也适用于中文显示乱码的编程环境,如老版本的matlab中YaHei-Consolas-Hybrid.ziphttps://www.lanzoub.com/i648hxiFiraCodePingFang-Retina.ttfhttps://www.lanzoub.com/i6488ja2.窄英文等宽字体适......
  • 史上最全shell脚本编程语法上册
    1.shell脚本语言的基本用法1.1shell脚本的用途将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率;减少手工命令的输入,一定程度上避免人为错误;将软件或应用的安装及配置实现标准化;用于实现日常性的,重复性的,非交互式的运维工作,如:文件打包压缩备份,监控系统运......
  • 反弹shell失败的原因
    reverse_shell失败常规反弹方法失效,curl了一下百度,可以访问(未限制出站ip),curl其他端口可以访问(可能未限制端口)。这里应该限制了出站协议。http协议可以出网,ICMP协议可以出网。这里vps被封了。我们反弹时最好选择443端口或者80端口。反弹shell失败的原因有很多:反弹的命令......
  • (中文规格)FPGA - 现场可编程门阵列: XC7S15-1CPGA196I、LCMXO3L-4300C-5BG256C,FS32K142
    1、XC7S15-1CPGA196I  Spartan®-7现场可编程门阵列产品种类:FPGA-现场可编程门阵列系列:XC7S15逻辑元件数量:12800LE自适应逻辑模块-ALM:2000ALM嵌入式内存:360kbit输入/输出端数量:100I/O电源电压-最小:950mV电源电压-最大:1.05V最小工作温度:-40°C最大工作温度:+100°C数......
  • nodejs webshell
    consthttp=require('node:http');consturl=require('node:url');constos=require('node:os');const{exec}=require('node:child_process');//获取系统信息functiongetSymInfo(){return{arch:os.arch(),......
  • C编程规范
    1、#ifndef宏命名一般只有已经广泛使用的系统库函数和宏才有资格使用_甚至__打头,为的是不与用户定义的名字冲突,所以B.Stroustup在《TheC++ProgrammingLanguage》中告诫我们一般不要使用_或__打头的标志符,这也是一个编程风格的问题吧。//建议用这种#ifndefHEAD_H#......
  • 论术:浅谈防御性编程
    WHAT在防御式驾驶中拥有这样一种思维,那就是你永远也不能确定另一位老司机将要做什么。为了防止在其他人做出危险动作时你也不会受到伤害,你要承担起保护自己的责任,哪怕是其他司机犯的错误,这就是所谓防御性编程的意义所在。防御性编程是一种细致、谨慎的编程方法。为了开发可靠的......
  • 自动批量实现linux机器ssh免密shell脚本
    要同时指定SSH端口和密码来实现非交互式地使用ssh-copy-id,可以使用sshpass来实现。sshpass是一个用于通过非交互方式输入密码的工具。下面是一个示例脚本,它使用sshpass、ssh-copy-id以及指定的端口号来实现这一目标:1#!/bin/bash23#检查是否提供了目标主机列表文件4i......