范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

教大家简单的Shell脚本入门操作

  Shell脚本 运作方式与解释型语言相当,如果有语言基础,学起 Shell 脚本就非常容易,但是 Shell 与常见的语言不同,一些常见的函数在 Shell 中需要组合一些命令得以实现 工具推荐
  Shell 似乎没有定制的 IDE,这里推荐 VS Code 搭配对应的插件: shellman 智能提示和自动补全,在插件页面有介绍常用代码片段的触发关键词,作者在 Shellman reborn 中写到了 Shellman 诞生的故事,挺有趣的 shellcheck 语法静态检查工具,插件安装后需要本地安装 shellcheck,参考 shellcheck Installing,Mac OS 可以使用 brew install shellcheck,这样在写 Shell 的时候,语法有误的地方就会以波浪线的方式提示 shell-format 代码整理,Win 快捷键:Alt + Shift + F,Mac OS 快捷键:option + shift + F Code Runner 脚本运行,右键 Run Code,Win 快捷键:Ctrl + Alt + N,Mac OS 快捷键:control + option + N 运行 shell 脚本
  新建脚本:test.sh #!/usr/bin/env bash  # 使用echo 打印字符串或者变量 echo "hello world"
  可以用 Code Runner 运行,就会输出:hello world
  在 Shell脚本 的第一行一般会写 #!/bin/bash 这个是 Shebang,#! 后面是解释器的绝对路径,脚本将用该解释器执行。还有一种写法是:#!/usr/bin/env bash,/usr/bin/env 是 env 命令的绝对路径,而 env 命令用于显示系统中已存在的环境变量,其中包含了 $PATH ,会在 $PATH 包含的目录依次找 bash,常见的命令行解释器有:sh ,bash ,zsh(Mac OS 默认解释器)
  如果在 Linux 或 类Unix 下运行,有这么几种方式: 先给脚本添加执行权限:chmod +x test.sh,然后运行脚本:./test.sh,这种方式执行会读取 Shebang,用指定的解释器执行脚本 sh test.sh,使用 sh 这个解释器执行脚本,当然也可以用其他方式执行,比如:bash test.sh。与第一种方式相同,当前的 shell 是父进程,生成一个子 shell 进程(子进程会继承父进程的环境变量),在子 shell 中执行脚本,脚本执行完毕,退出的 shell 回到当前 shell source 点命令方式:source test.sh 等效于 . test.sh。source 让脚本在当前 shell 执行,不生成新的子进程。使用 source 执行脚本,脚本中对于环境变量的修改会作用于当前 shell,这就是为什么我们在修改了一些配置如:~/.bashrc,执行 source ~/.bashrc 后配置就生效了 exec 方式:有需要先给脚本添加执行权限:chmod +x test.sh,执行 exec ./test.sh,也是让脚本在同一个进程上执行不生成新的子进程,与 source 的区别就是,在脚本执行完成后进程会被结束 基础命令
  可以按照 [Bash Shell] Shell学习笔记 学习,这篇文章讲得非常详细,本篇博客也是在学习这篇文章后写下的 获取输入
  使用 read 命令,从标准输入流 (stdin) 获取输入 #!/usr/bin/env bash read var echo "${var}"
  运行脚本,输入任意字符,回车确认,输入的值会赋值给变量 var,并打印出该变量 输出#!/usr/bin/env bash var=1 # 输出变量 echo ${var} # 输出字符串 显示部分字符需要转义 echo ""hello world"" # "hello world"  # 换行使用 -e 参数:使转义字符生效 # 使用   换行 echo -e "newline "
  也可以让 shell 输出不同颜色的字符,可以参考:shell脚本中echo显示内容带颜色 #!/usr/bin/env bash echo -e "33[30m 黑色字 33[0m"  echo -e "33[31m 红色字 33[0m"  echo -e "33[32m 绿色字 33[0m"  echo -e "33[33m 黄色字 33[0m"  echo -e "33[34m 蓝色字 33[0m"  echo -e "33[35m 紫色字 33[0m"  echo -e "33[36m 天蓝字 33[0m"  echo -e "33[37m 白色字 33[0m"  变量使用# = 两边不能有空格 var="hello world" num=100   # 在引用变量时,这种方式可以,但是推荐下面一种 echo $var # 推荐在使用字符串变量时,在两侧加上双引号,否则如果变量字符串中存在空格,则字符串会被切分 echo "$var" # 如果涉及字符串拼接,可以在变量名两侧加上花括号 echo "变量为: ${var}."  # 将变量设置为只读,再次修改会报错 readonly var # var="wolrd"  # 删除变量,不能删除 readonly 修饰的变量 unset num
  变量赋值时,变量名命名规则和其他语言类似, 注意变量赋值时 = 两边不能有空格
  使用时在变量名前加上 $,推荐所有的变量都使用 ${} 的方式使用变量 运算
  算术运算:Bash 原生不支持数学运算,可以使用 awk 和 expr
  注意乘号需要加上转义:*,而且 运算符两侧必须空格 a=10 b=3 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a * $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" 执行命令
  $()与 ``(反引号)都可以用于执行命令,并会将执行的结果返回,shellcheck 推荐使用第一种 $() 的方式 #!/usr/bin/env bash result=`date "+%Y-%m-%d"` echo "${result}"  result=$(date "+%Y-%m-%d") echo "${result}" 运算符
  关系运算符只支持数字,如果字符串为数字也可以,关系运算符包括:
  运算符
  含义
  -eq
  等于
  -ne
  不等于
  -gt
  大于
  -lt
  小于
  -ge
  大等于
  -le
  小等于
  条件表达式必须放在 [] 中,并且 [ 的右侧,和 ] 的左侧必须留有空格
  布尔运算符列表:
  运算符
  含义
  !
  非
  -o
  或 (or)
  -a
  与 (and) #!/usr/bin/env bash  a="10" b="3" c=1  if [ ${a} -ne ${b} ] then     echo "相同" else     echo "不相同" fi  if [ ${a} -gt ${b} -a ${b} -gt ${c} ] then     echo "a > b & b > c" fi
  其他常用判断: 直接在 [ ] 中放字符串变量 如 [ ${str} ] 则就是判断 str 这个字符串是否非空 -f 判断是否为普通文件,如:[ -f $file ] -d 判断是否为文件夹,如:[ -d $file ] 字符串截取
  字符截取的格式:${string: start :length}
  索引从 0 开始,可以省略 :length 这样就截取到最后,注意空格要空在 : 后,否则可能提示:bad substitution #!/usr/bin/env bash string="hello world" echo ${string: 1 : 3} # ell # 截取到最后 echo ${string:1} # ello world 数组#!/usr/bin/env bash # 1. 定义数组:使用括号声明,用"空格"分隔开,也可以换行隔开 arr=(1 2 3) strArr=( "first" "second" )  # 2. 读取数组:通过下标读取,下标从 0 开始计算 echo "${arr[0]}"  # 使用 * 或者 @ 读取所有元素 echo ${arr[*]} echo ${arr[@]}  # 读取数组长度 读取全部元素前面加上 # echo ${#arr[*]} echo ${#arr[@]}  # 遍历下标 for(( i=0;i<${#strArr[@]};i++))  do echo ${strArr[i]}; done;  # for in 遍历元素 for element in ${strArr[*]} do echo $element done  # 3. 修改数组元素 strArr[0]="modify" echo ${strArr[0]}  # 4. 删除元素 unset arr[1] echo ${#arr[*]} echo ${arr[*]} # 1 3 # !使用 unset 要注意,这其实并不是真正删除了该元素,而只是将该元素置空,所以使用下标遍历会出问题,如下 echo "数组遍历:" for(( i=0;i<${#arr[@]};i++))  do echo "index ${i} -> ${arr[i]}"; done; # index 0 -> 1 # index 1 ->   # 解决 unset 无法真正删除的方法:重新赋值给新的数组 echo "数组遍历:" arr=( "${arr[@]}" ) for(( i=0;i<${#arr[@]};i++))  do echo "index ${i} -> ${arr[i]}"; done; # index 0 -> 1 # index 1 -> 3 判断语句
  使用 if 和 fi 定义判断的边界,使用 then , elif , else 定义条件 #!/usr/bin/env bash #!/usr/bin/env bash  a=10 b=20 if [ $a == $b ] then     echo "相等" else     echo "不相等" fi  if [ $a == $b ] then     echo "相等" elif [ $a -lt $b ] then     echo "a 小于 b" else     echo "其他情况" fi 函数
  调用函数时,我们可以传入参数,可以通过 $n 来获取参数,这里的 n 表示 需要取的参数的索引,当n>=10时,需要使用${n}来获取参数
  $# 传递给函数的参数个数,$* 和 $@ 显示所有传递给函数的参数,$? 表示函数的返回值,也可以用于获取上一个命令的退出状态,执行成功会返回 0,失败返回 1 # 定义函数 #!/usr/bin/env bash funWithParam(){     echo "参数个数:$#"  # 参数个数:11     echo "传递给函数的所有参数:$*" # 传递给函数的所有参数:1 2 3 4 5 6 7 8 9 34 73     echo "$1" # 1      # 超过 9 的参数需要用 ${} 接收参数,否则直接显示数值     echo "$10" # 10     echo "${11}" # 73   }  # 调用函数:函数名后面直接跟上参数 funWithParam 1 2 3 4 5 6 7 8 9 34 73 echo "$?" # 0 输入输出重定向
  使用 > 将应该输出到终端上的数据重定向输出到文件,> 默认为覆盖文件,使用 >> 追加写入文件
  使用 < 将默认从键盘输入的数据,定向为从文件输入 # who 命令用于显示系统中有哪些使用者正在上面 # 将结果输入 who.txt who > who.txt  # wc -l 作用是计算文本行数 wc -l < who.txt
  一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件: 标准输入 (stdin):stdin 的文件描述符为 0,Unix 程序默认从 stdin 读取数据 标准输出 (stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据 标准错误输出 (stderr):stderr 的文件描述符为 2,Unix 程序会向 stderr 流中写入错误信息
  所以一般我们后台启动应用并且输出日志文件都使用: nohup java -jar xxx.jar >> nohup.log  2>&1 &
  nohup:(no hang up) 保证在 退出帐户 或者 关闭终端 之后继续运行相应的进程
  >> nohup.log:将 java -jar xxx.jar 的输出追加到 nohup.log 文件
  2>&1:将 java -jar xxx.jar 的 标准错误输出 也重定向到 标准输入
  &:让进程在后台运行
  默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
  如果希望 stderr 重定向到 file,可以这样写: 坑梳理变量赋值时,变量名命名规则和其他语言类似, 注意变量赋值时 = 两边不能有空格 数组 unset 元素,并不是真正的移除元素 获取参数时,当 n>=10 时,需要使用${n}来获取参数 常见的特殊 Shell 环境变量$ 表示当前Shell进程的ID,即pid $0 表示当前脚本的绝对路径 $# 传递给脚本或函数的参数个数 $n 传递给脚本或函数的参数 $? 上个命令的退出状态 $* 和 $@ 传递给脚本或函数的所有参数 $n n 代表 1~9 其中任意一个数字,传递给脚本或函数该位置的参数
  $* 和 $@ 区别: #!/usr/bin/env bash function asterisk () {     echo ""$*""     for var in "$*"     do         echo "$var"     done }  function mail () {     echo ""$@""     for var in "$@"     do     echo "$var"     done } asterisk a b c  mail a b c
  输出 "$*" a b c "$@" a b c
  当 $* 和 $@ 直接使用效果相同,都是接收一份数据如上所示的例子,接收到的就是:a b c,一份数据,以空格隔开。加了双引号后 "$@" 会将每个参数都当成一份独立的数据
  原文链接:https://www.cnblogs.com/aaronlinv/p/15764053.html

携号换网后还有大麻烦你可能得换手机此前,工信部部长苗圩在部长通道上透露,今年年底前将在全国实行携号转网。这意味着这意味着,携号转网在试行9年之后,今年内终于有望在全国范围内转正,消费者将想转就转。用户对携号转网的需Web前端为什么使用Angular?如果你打算做移动APP开发,那么AngularJSAPP开发将是你的绝佳选择。不仅移动APP,AngularJS也将是你的WebAPP开发需求的最佳工具。这是因为,有了AngulaRedmi路由器AX6优缺点对比优点1。配置强悍,跟小米ax3600就差一根lot天线,配合openwrt固件功能丰富玩法多。2。信号不错,我家是农村自建房,移动300m,放在4楼卧室,3楼和5楼还能跑到100m三星GalaxyWatch5手表Pro版曝光,电池容量大增60财经网科技4月9日讯,据IT之家援引SamMobile消息,三星可能正在开发GalaxyWatch5的Pro版本。长期以来,三星GalaxyWatch智能手表都有两个版本。到202面试官MySQL权限表损坏导致无法启动怎么办?一背景近期,公司RDS云产品的MySQLServer版本进行升级,由目前使用的5。7。26版本升级到最新版本5。7。31升级后测试同学发现在MySQL创建用户后,5。7。31版本重马云的海外资产到底有多少?说话短短一年的时间资本家的丑陋面目逐渐被撕开,马云作为阿里巴巴的创始人在中国可谓是无人不知无人不晓,可以说是马云引领了中国乃至全世界的电商企业飞速发展,如果没有马云可能就不会有今天千元机的骁龙888Plus摩托edgeS30升级安卓12格外流畅目前行业中搭载骁龙888Plus的机型不少,而最实惠的就属摩托edgeS30了,只要1799元的首发价就能买到。最近推出的摩托edgeS30冠军版12512GB也只要2499元,不终于定了新买一台电脑主机终于定了新买一台电脑主机的决心!之前,一直犹犹豫豫,你说这电脑能用吧,打开剪映软件,搞不好,就死一下机,有时等得很烦!我的台式电脑,是不折不扣的老式的。装的XP系统,初级还是挺好用格力1。5匹云佳和云海哪个好?比起云锦II差在哪里?大家好,我是QSY,格力云佳云海云锦2我都拆过,我的购买建议是首选云海(或云恬)次选云佳,云锦2性价比低。1。5匹格力云佳新一级KFR35GWNhGc1B海立GSD102UKRA7隐退江湖的马云,如何才能再创神话?马云,阿里巴巴的创始人,曾经的中国首富,也曾被一些老百姓戏称为马爸爸。阿里的支付宝淘宝等app彻底改变了中国人的购物和支付习惯,使中国成为全球网购和电子支付最便捷的国家。曾几何时,B站进军硬件领域推出真无线蓝牙耳机bilipods大家都知道bilibili是一家知名的视频在线平台,并且在该平台下也售卖许多二次元周边产品,不过他们最近开始进军消费电子的硬件市场了,他们旗下的文创衍生品牌BEMOE推出了一款真无
2020全球包裹运输量超1310亿件,中国继续遥遥领先据PitneyBowes最新发布的包裹运输指数(ParcelShippingIndex),2020年全球包裹运输量超过1310亿件,平均每秒达到4160件包裹,较2020年显著增长高尔夫女司机体验KiWiEV,三天后,车主我想换车了参加工作3年,生活工作几乎都比较稳定,我也在考虑买一台车。一开始家里提议给我买一台奥迪A3,毕竟豪华品牌开着有面子,尺寸也比较适合我这样的女司机。但考虑到自己的工作,我还是更愿意选宝骏RS3到店实拍,9。38万就配1。5T全景天窗距离宝骏RS3正式上市已经有一年多了,这款车从上市初期至今,便一直得到很多年轻消费者的关注和讨论,在市场中的热度是比较高。毕竟这款车拥有年轻人喜欢的个性化外观设计,还有小型SUV身进店实拍RS3,9万多就给1。5T发动机运动座椅众所周知,自打SUV火起来后,该车型的热度就从未低过,甚至可以说是越来越火热。因为随着汽车消费市场的不断细分化,一些8万级SUV15万级SUV25万级SUV,也顺势诞生比如离年轻人支持国产车就选它,顶配13w落地,座椅像沙发,适合家用我对国产车一直都有一种好感,我觉得这是国人自己的车,我身为国人自然应该支持。另外,最近几年我看网上的口碑评价,很多国产车主都说国产车有所进步不比合资车差。所以在选车看车的时候,我优英伟达RTX3080TI定了!看似提升很大,其实老黄给咱耍了个小聪明Hello大家好,我是兼容机之家的小牛!距离RTX20系列显卡发布已经过去了近两年的时间,这两年里,虽然NVIDIA和AMD新显卡不断,但是没有一款显卡的性能能够触摸到RTX208不可思议,笔记本CPU性能超台式机CPU,AMD果然惊喜多多!Hello大家好,我是兼容机之家的小牛!了解电脑的朋友都知道,其实台式机和笔记本上同档次的CPU性能相差是非常大的。就拿同样是i5处理器来说,笔记本上上面的i58250U和桌面版iSSD没有技术含量?家电企业都跑来做固态,性能不错价格还便宜!Hello大家好,我是兼容机之家的小牛!很多人家里的电脑都已经是老古董了,但是有的老古董虽然反应是慢了一点,但也不是不能用。为此,很多人都准备给老电脑升级一波,让老电脑也能焕发第二愚人节来临,康康大公司有哪些惊喜彩蛋,谷歌今年的做法真有意义Hello大家好,我是兼容机之家的小牛!一年一度的愚人节又到了,但是今年的愚人节恐怕和以往不一样了,毕竟今年是全人类都在抗击病毒,很多不少的公司都取消了愚人节的活动彩蛋等。据国外媒如果不考虑预算,用最顶级的硬件装一台电脑,需要多少钱?Hello大家好,我是兼容机之家的小牛!现目前消费领域最贵的性能最强的CPU是哪一款?让我们来翻一下CPU天梯图,答案是AMD的三代线程撕裂者3990X,64核心128线程设计,基某平台的网吧二手吃鸡电脑,价格仅需950,这样的电脑能不能买?Hello大家好,我是兼容机之家的小牛!对于预算不是很多,或者想花较少的钱就能获得更好的用户体验的消费者来说,二手电脑配件就是一个不错的选择。有的二手电脑配件等产品虽然不是全新的,