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

教大家简单的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

不止技术问题,辅助自动驾驶的人性悖论不完美的辅助驾驶系统就是在挑战人性,挑战惰性。文Toretto在这个信息过剩的时代,一周的时间也没有让蔚来NOP事件冷却下来。毕竟安全永远是汽车行业的第一要义。事故发生在8月12日什么样的车企能够打败特斯拉们?拥抱电动与智能的变革,方能领跑未来,而数字化转型同样是博弈的重中之重。文东篱并非所有逆流而上的人都是勇士,如今,新能源汽车市场的大势浩浩汤汤,顺之者昌,逆之者亡。百年未遇的汽车产业自动驾驶竞赛,大战开启下半场上半场证明技术的可行性,自动驾驶的下半场该拼什么?文Toretto自动驾驶已经来到了下半场。小马智行联合创始人兼CEO彭军如是说。在中国工程院院士李德毅看来,经过35年的从0到1的夏季测试开启,积跬步的恒大汽车将至千里恒大造好车再进一步,奔赴智能电动汽车的星辰大海。撰文Toretto恒大汽车一直想要走出属于自己的造车路。只是蔚来10万辆下线,理想汽车开始喊出月销万辆的口号,而目标年产500万的恒究竟什么是智能汽车?10万以下有没有智能汽车?文Toretto如果没有一款加了若干冠词的智能电动汽车,车企现在都不好意思卖车了。在9月国新办的发布会上,工信部部长肖亚庆除了鼓励新能源汽车企业鼓励兼并重汽车元宇宙风口还是噱头?未来的征途,不只是星辰大海,而是再造一个宇宙。文东篱汽车工业的敌人就是现在所谓的元宇宙。投资哪吒汽车的周鸿祎之前曾戏言,因为元宇宙所宣扬的是在屋里不出来就可以互相见面。另一方面,不驾驶辅助升级2021款理想ONE售33。8万元起新车上市日前,2021款理想ONE正式上市,作为中期改款,新车在智能化配置方面有所升级。并且,除了售价33。80万元的标准版外,新车还提供一款BabyBlueDeepGreenTe智能大战开战,整车OTA哪家强?智能化已经成为衡量汽车品质的重要因素,OTA以及整车OTA则逐渐成为衡量汽车智能化的关键所在。这一点,在新能源车型上表现得尤为突出。2012年,特斯拉ModelS的上市,让特斯拉成五大造车新势力PK蔚来第一,理想被哪吒反超当特斯拉疲于奔命的时候,国产各大造车新势力有迎来狂欢吗?6月初,包括蔚来小鹏理想在内的五大热门造车新势力车企相继公布了5月的交付数据,一起来看看成绩如何。蔚来5月,蔚来共交付整车6自动驾驶的未来,谁人能看透未来谁掌握真正的自动驾驶平台化技术,谁就会是王者。文Toretto刚刚成立的时候,我们也是豪情万丈,要拳打谷歌,脚踢百度。其实很多自动驾驶领域的创业公司在成立伊始,基本都如驭势科技CES2020微星推出首款1000曲率显示器和AegisTi5电竞主机在CES2020上,微星推出了世界上第一台1000R曲率的曲面电竞显示器OptixMAG342CQR。作为世界上首款拥有1000R曲率的电竞显示器,OptixMAG342CQR拥有
新京报转移到以App为中心Netflix宣布三部原创电影先在影院首映1新京报转型,以报纸为中心转移到以App为中心事件近日,新京报正式推出App,新京报将以移动传播视频表达为优先,把移动客户端作为新京报传播主阵地打造,并适时推出新闻业务(政务民生服首批5G网络覆盖城市名单公布中国电影票房9年来首现负增长1首批5G网络覆盖城市名单公布40城将率先获益事件近日,中国移动与中国联通公布了首批5G网络覆盖城市,两大运营商将覆盖至少40个城市,并在部分城市推出5G服务。首批支持5G网络的城你所熟知的南极人,靠着卖商标净赚几十亿一年一度的双十一又来了,正逢秋冬换季加衣保暖的时候,你的购物车里有没有一件南极人品牌的衣物?南极人这个品牌相信大家都比较熟悉,以销售保暖内衣服装等产品打响了品牌。一说南极人,大家似AWE告诉你选节能空调,不用担心产生昂贵电费AWE2021才结束没多久,高科技产品使我觉得眼花缭乱,有些产品没有投放到市场,概念非常高端,不过也需要更多的验证,才能完全广泛使用。很多人也在关心家电发展趋势,个人对黑科技不感冒格隆克超级碗NFT在拍卖会获得160万美元的Ethereum在本周末的拍卖会上,四届超级碗冠军罗布格隆科夫斯基所铸造的NFT交易卡合计以830以太(价值超过160万美元)的价格成交。最大的卖家是一张1张1的职业生涯高光折射卡,以232ETH中端机性能不足,RedmiNote10系列是否能够扭转局面?米粉了大家注意了,RedmiNote10系列即将来袭,我作为一个资深米粉,还是非常期待!据官媒发布的RedmiNote10系列手机相关线索透露,RedmiNote10系列可能会创设全球最大的资产管理公司黑石一直在隐秘交易比特币在1月份的美国证券交易委员会文件中,投资公司黑石表示,未来可能会在其基金中加入比特币期货。在今天起的SEC新文件中,黑石全球配置基金表示,它持有芝加哥商品交易所的37份期货合约,价让黄飞鸿从天而降的那把雨伞,真的存在?这把黑科技雨伞有答案了黄飞鸿系列电影是我们男孩子小时候最爱看的电影,喜欢它不单是因为它的剧情丰富,还有里面各种华丽的动作设计也是很精彩的。比如,我小时候印象最深的就是黄飞鸿手持一把雨伞,缓缓地从天而降的比特币涨势可能在4月或ampampquot更早ampampquot回到巅峰状态主要加密投资公司PanteraCapital的联合首席投资官JoeyKrug表示,尽管比特币(BTC)最近出现了大跌,但它的市场仍然是健康的,这对于这个新兴行业的牛市来说是很平常的Coinbase在一次私人拍卖中估值900亿美元据悉,总部位于美国的大型加密交易所Coinbase在一次私人拍卖中的价值为900亿美元。据彭博社援引知情人士的话报道,上周该公司股票交易价值约为900亿美元,按照每股350美元计算内蒙古或将推动比特币矿工向绿色能源发展中国内蒙古自治区加密采矿活动的中心,特别是比特币(BTC)挖矿,可能将颁布对该行业的关闭令,命令所有运营商最早在下个月关闭,这可能推动他们使用更绿色的能源。根据官方公告,一套新的能