shell脚本学习-04

2023-11-03

65.IFS:文本分隔符

默认的文本分隔符是’ ',但是可以手动设置为其他的,如:‘:’ ‘|’ ': ’

cities=Delhi:chennai:bangaluru:kolkata
old_ifs="$IFS"
IFS=":"
for place in $cities
do
  echo the name of city is $place
done

66.tr 字符替换

tr 'abcd' 'efgh' #一一对应的,将a->b b->f c->g 

67.函数定义

function function_name(){
    
}

function_name(){
    
}

查看当前shell环境中定义的函数:

declare -f

清除当前shell中的函数:

unset -f function_name
yesno(){
  while [[ true ]]; do
    echo "$*"
    echo "please answer by entering yes or no:"
    read reply
    case $reply in
      yes)
      echo "you answer yes"
      return 0
      ;;
      no)
      echo "you answered no"
      return 1
      ;;
      *)
      echo "invalid input"
      ;;
    esac
  done
}
yesno

如何在函数中共享变量

temp="/temp/filename"
remove_file(){
    echo "removing file $temp...."
}
remove_file

68.local:本地局部变量

函数本地变量设置:
在上述程序段中,temp变量可能会被任意函数修改,如果我们希望获得一个只在本函数起作用的变量,那么加上local关键字就好。

name="john"
hello(){
  local name="Mary"
  echo $name
}
echo $name
hello
echo $name

69.函数返回值。

函数只能返回整数,如果想返回字符串啥的,需要将值存储在一个全局变量中,或者输出到临时file中。
如果不在函数中使用return,那么函数执行的最后一行命令是否成功就会被作为返回值返回。

is_user_root(){
    [ $(id -u) -eq 0 ];
}
is_user_root && echo "you are root user, you can go ahead." || echo "you need be administrator to run this script"

70.函数也可以被放置到后台执行。

dobackup(){
    echo "started backup"
    tar -zcvf /dev/st0 /home >/dev/null 2>&1
    echo "completed backup"
}
dobackup &
echo -n "task..done."
echo
输出:
task..done
started backup
completed backup
所以将任务放到后台后,将相当于执行了异步操作。

71.source关键字。

避免创建新的shell环境,直接在当前shell环境中运行shell命令。这样当前的所有变量以及函数都可以在新的shell脚本中可用。
语法格式:

source filename [arguments]
或者
. filename [arguments]

source关键字可以用来加载shell脚本库。那么脚本中的所有函数和变量均可以在当前shell中使用。

72.中断与陷阱:trap

语法格式:

trap 'command; command' signal-name
trap 'command; command' signal-number

例子:

trap 'echo "you pressed control key"' 0 1 2 15
或者
trap  "  " INT QUIT TSTP #表示忽略这几个中断。

命令行输入 kill -l 就会显示所有的中断名字及中断号
恢复默写信号的默认行为:

trap signalName or signal number

捕捉ctrl+c ctrl+\信号

trap "echo caught signal sigint" SIGINT
trap "echo caught signal SIGQUIT" 3
trap "echo caught signal SIGTERM" 15
trap "echo caught signal SIGTSTP" TSTP
echo "enter any string (type 'dough' to exit)."

while [[ true ]]; do
  echo "rolling...\c"
  read string
  if [[ "$string" = "dough" ]]; then
    break
  fi
done
echo "existing normally"

73.dialog

终端弹出dialog。
例子:

dialog --msgbox "This is a message." 10 50

弹出选择dialog,并相应用户的选择操作。

dialog --title "Delete file" \
--backtitle "Learning Dialog Yes-No box" \
--yesno "Do you want to delete file \" ~/work/sample.txt\"?" 7 60
#selecting "yes" button will return 0 这个很关键。
#selecting "No" button will return 1.
#selecting "ESC" will return 255.
result=$?
case $result in
  0 ) rm ~/work/sample.txt
    echo "File deleted."
    ;;
  1) echo "File could not be deleted.";;
  255) echo "action cancelled - Pressed [ESC] key.";;
esac

输出图形界面如下:
───────────────────────────────────────────────────────────

┌──────────────────────Delete file─────────────────────────┐
│ Do you want to delete file " ~/work/sample.txt"?         │
│                                                          │
│                                                          │
├──────────────────────────────────────────────────────────┤
│                 < Yes >         < No  >                  │
└──────────────────────────────────────────────

74. >$ 创建文件。

fileName #会创建一个文件名为filename的空文件
语法格式:command > filename

75. inputBox:弹出输入对话框。

result="output.txt"
> $result #创建一个空文件
dialog --title "inputbox demo" \
--backtitle "learn shell scripting" \
--inputbox "please enter your name " 8 60 2>$result
response=$?
name=$(<$result)
case $response in
  0 ) echo "hello $name"
    ;;
  1 ) echo "cancelled."
    ;;
  255) echo "escape key pressed."
    ;;
esac
rm $result

76.textbox:文本显示对话框。

#将文件/etc/passwd中的内容显示在textbox中
dialog --textbox /etc/passwd 10 50

77.密码输入框:insecure.

当要求用户输入密码时,以*显示输入的密码。

#creating the file to store password
result="output.txt"
touch $result 2>/dev/null

#delete the password stored file, if program is existed pre-maturely
trap "rm -f output.txt" 2 15 #这里的考虑也比较周到,捕捉一些退出的信号量,保证密码文件能被删除

dialog --title "password" \ #注意:反斜杠与命令选项间需要加空格。
--insecure \
--clear \
--passwordbox "please enter password" 10 30 2> $result

reply=$?
case $reply in
  0 ) echo "you have entered password: $(cat $result)"
    ;;
  1)  echo "you have pressed cancel"
    ;;
  255) cat $data &&  [ -s $data ] || echo "escape key is pressed."
    ;;
esac

78.menubox:用户选择输入框。

如下例子:弹出一个列表选项,用户可选择其中任意一项,然后根据用户的选择,程序作出相应的反应。

RESPONSE=menu.txt
TEMP_DATA=output.txt
vi_editor=vi
trap "rm $TEMP_DATA;rm $RESPONSE;exit" SIGHUP SIGINT SIGTERM
#同理,这里的考虑也比较周到,捕捉信号删除文件。
function display_output() {
  dialog --backtitle "learning shell scripting" --title "output" --clear --msgbox "$(<$TEMP_DATA)" 10 41
}
function display_date() {
  echo "today is `date` @ $(hostname -f)." > $TEMP_DATA
  display_output 6 60 "date and time"
}

function display_calendar() {
  cal > $TEMP_DATA
  display_output 13 25 "Calendar"
}

while [[ true ]]; do
  dialog --help-button --clear --backtitle "learn shell scripting" \
  --title "[ Demo Menubox ]" \
  --menu "Please use up/down arrow keys, number keys\n\ 
  1,2,3..,or the first character of choice \n\
  as hot key to select an option" 15 40 4 \ #menu后面跟的是选项。 
  Calendar "Show the Calendar" \
  Date/time "show date and time" \
  Editor "start vi editor" \
  Exit "Terminate the script" 2>"${RESPONSE}"
  menuitem=$(<"${RESPONSE}")

  case $menuitem in
    Calendar )
      display_calendar
      ;;
      Date/time ) display_date ;;
      Editor) $vi_editor;;
      Exit) echo "thank you!";break;;
  esac
done


[ -f $TEMP_DATA ] && rm $TEMP_DATA
[ -f $RESPONSE ] && rm $RESPONSE

多选框:checklist box

#按方向键切换选项,按空格键切换选中转态
dialog --checklist "this is a checklist" 10 50 2 \
"a" "this is one option" "off" \
"b" "this is the second option" "on"

单选框:radiolist box

dialog --radiolist "this is selective list, where only one \
      option can be chosen" 10 50 2 \
      "a" "this is the first option" "off" \
      "b" "this is the second option" "on"

进度条:gauge

declare -i COUNTER=1
{
  while test $COUNTER -le 100
  do
    echo $COUNTER
    COUNTER=COUNTER+1
    sleep 1
  done
} | dialog --gauge "this is a progress bar" 10 50 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本学习-04 的相关文章

  • 如何在 Xcode 4.2 中创建 Shell 脚本目标?

    我想知道是否有人知道 XCode 4 1 如何创建 shell 脚本 该选项不存在 但在最新版本中可能会被称为其他名称 塔 在导航器中选择您的项目 单击 添加目标 为空目标选择 聚合 添加构建阶段 gt 添加运行脚本 单击构建阶段并编辑运行
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 如何通过 shell 脚本确定网页是否存在?

    我正在尝试制作一个程序 可以将一系列漫画扫描转换为一个 pdf 文件 并且我不想尝试下载图片来确定我是否有正确的网址 是否有一个 shell 脚本命令可以用来检查网页是否存在 在 NIX 下 您可以使用curl发出一个简单的HEAD要求 H
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • tar 和 zip 有什么区别? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 tar 和 zip 有什么区别 每个的用例是什么 tar其本身只是将文件捆绑在一起 结果称为tarball 尽管zip也应用压缩 通常你使用gzip随
  • 如何将设备屏幕位置转换为发送事件位置?

    我知道关于input tap x yshell 命令 但是 我想了解如何 使用执行单击sendevent命令 我能够通过以下命令实现它 sendevent dev input event5 3 53 X sendevent dev inpu
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • SCP 权限被拒绝(公钥)。仅当在目录上使用 -r 标志时才在 EC2 上

    scp r Applications XAMPP htdocs keypairfile pem uploads ec2 user publicdns var www html 其中 uploads 是目录 返回权限被拒绝 公钥 Howeve
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 将文件从不同目录复制到公共目录

    我有很多目录 其中包含 c文件 我想复制全部 c使用 shell 脚本将不同目录中的文件复制到单个目录 find name c exec cp t tmp 启动当前目录中的所有项目 递归 获取名称结尾的项目 c 将这些项目复制到 tmp 如
  • shell脚本中的\r字符

    我在尝试执行 shell 脚本时收到以下错误 r command not found line 2 请提出同样的解决方案 以下是脚本中使用的初始行 bin sh if lt 1 then echo ERROR Environment arg
  • 如何执行“sudo nvm”?

    在我的 Mac 上 我想将一些需要 su 权限的包迁移到另一个节点版本 我使用 homebrew 安装 nvm 现在我需要执行 sudo nvm 或 reinstall packages将失败 me MacBook sudo nvm sud
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • UNIX系统调用监视器

    如何监控进程的系统调用 Check strace http linux die net man 1 strace 在最简单的情况下 strace 运行指定的命令直到退出 它拦截并记录进程调用的系统调用以及进程接收的信号 每个系统调用的名称
  • awk/Unix 分组依据

    有这个文本文件 name age joe 42 jim 20 bob 15 mike 24 mike 15 mike 54 bob 21 试图得到这个 计数 joe 1 jim 1 bob 2 mike 3 Thanks awk F NR
  • 如何从 Artifactory 存储库下载最新的工件?

    我需要来自存储库的最新工件 例如快照 人工工厂 http en wikipedia org wiki Software repository Repository managers 该工件需要通过脚本复制到服务器 Linux 我有什么选择
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug

随机推荐

  • idea Context: local file . file is included in 3 contexts

    最近不知道咋滴 我的好几个项目的applicationContext xml文件的头部都会出现这样的一个提示 看着很不舒服 删掉facts后 再重新加入 结果是这样就没有提示了
  • AcWing 902. 最短编辑距离(动态规划)

    这个题也做到过 貌似是鹅厂的压轴题 用三种方式编辑两个字符串的相似距离 题目 集合 将a 1 j 变成b 1 j 的操作方式 属性 min 考虑过程比较难 从末尾开始考虑 三种操作方式上着手 以下来自AcWing网友整理 很细致 有三种操作
  • 总结如何用 AbstractQueuedSynchronizer实现一个同步组件

    如何实现 1 创建一个名字为 MyTestLock接口 implment Lock 2 在 MyTestLock中 创建一个内部类 MyTestSyn 但是继承AbstarctQueuedSynchronizer 3 AbstarctQue
  • 前端与小程序

    之所以写这个因为我大半年没写过小程序了 早就记不清格式和规范了 最近又要写 用前端的方法写发现一堆用法错误 所以做个总结以后方便查询 1 数据绑定 vue中html的属性绑定一般在属性前加 比如 value data 只有innerHTML
  • sudo rosdep init ERROR: cannot download default sources list from: https://raw.githubusercontent.com

    安装上ros无法进行rosdep init 解决方法如下 https zhuanlan zhihu com p 77483614 因此 在 usr lib python2 7 dist packages rosdep2 sources li
  • ambari增加host节点 安装ambari-agent

    基于配置好所需的环境 1 进入Hosts 选择Add New Hosts 2 从主节点 root ssh 下拷贝出id rsa文件 3 添加节点hostname ambari3 node com 和添加id rsa 注册 成功添加 之后一直
  • BMP文件转YUV文件

    目录 一 实验原理 1 BMP文件格式分析 位图文件头 BITMAPFILEHEADER 位图信息头 BITMAPINFOHEADER 调色板 Palette 实际的位图数据 ImageData 注意 字节序 2 RGB文件转YUV文件 R
  • 静态分析-常量传播

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 ConstantPropagation 1 newBoundaryFact CFG 2 newInitialFact 3 void meetInto CP
  • vue scoped属性的作用

    当style标签具有该scoped属性时 其CSS将仅应用于当前组件的元素 作用功能 实现组件的私有化 不对全局造成样式污染 表示当前style属性只属于当前模块虽然方便但是我们需要慎用 因为当我们使用公共组件时会造成很多困难 增加难度 想
  • ValueError: Attempt to convert a value (1) with an unsupported type xx to a Tensor

    如题所述问题 其本质是tensorflow版本不兼容的问题 但是为了一个错误去更新tensorflow版本 往往会消耗较长时间 而且说不定会引起其他地方依赖的问题 关于该问题可以考虑从不同角度进行考量 迂回解决 比如我在实验中 在使用a N
  • Flowable

    flowable介绍 flowable 是一个业务流程管理 BPM 和工作流系统 适用于开发人员和系统管理员 它是著名 Java 工作流引擎 Activiti 的原作者从 Activiti 分支创建的新工作流引擎 其核心是超快速 稳定的 B
  • 了解 ceil 和 floor 函数:C++ 中的取整函数

    在许多实际应用中 我们需要对浮点数进行取整操作 C 中提供了两个非常有用的函数 即 ceil 和 floor 用于进行向上取整和向下取整 这两个函数是 C 标准库 头文件中的函数 下面我们分别来了解一下它们的具体用法和示例 ceil 函数
  • ReactiveUI 入门

    ReactiveUI入门 ReactiveUI使您能够使用MVVM模式构建反应式 可测试和可组合的UI代码 请参阅我们的ReactiveUI文档手册 我们还有一个完整的跨平台演示应用程序 入门 要开始使用 请访问我们的 安装 页面 在引人注
  • CG v-光照着色探索:Educoder

    CG v 光照着色探索 Educoder 光照着色是计算机图形学中一个关键的概念 它可以使得渲染出的场景更加逼真和具有立体感 在本文中 我们将深入探讨光照着色的原理和实现 并使用源代码来演示 首先 让我们来了解一下什么是光照着色 在计算机图
  • 隐马尔可夫模型(HMM)攻略

    隐马尔可夫模型 Hidden Markov Model HMM 最初由 L E Baum 和其它一些学者发表在一系列的统计学论文中 随后在语言识别 自然语言处理以及生物信息等领域体现了很大的价值 平时 经常能接触到涉及 HMM 的相关文章
  • [Spring Boot]03 Maven常用的打包(packaging)类型

    目录 什么是pom xml Maven常用的打包类型 jar war pom 什么是pom xml POM是项目对象模型 Project Object Model 的简称 它是Maven项目中的一个XML文件 pom xml 此文件用于管理
  • 常见编译Warning的解决方法

    Warning 1 always inline redefined enabled by default 意思是 always inline 重复定义了 位置分别是gcc arm none eabi 4 8 4 include fixed
  • java实体类根据某个或多个属性排序

    public class ListUtils 对list的元素按照多个属性名称排序 list元素的属性可以是数字 byte short int long float double等 支持正数 负数 0 char String java ut
  • cv2.resize

    import cv2 img cv2 imread home img python png cv2 IMREAD UNCHANGED print Original Dimensions img shape scale percent 60
  • shell脚本学习-04

    65 IFS 文本分隔符 默认的文本分隔符是 但是可以手动设置为其他的 如 cities Delhi chennai bangaluru kolkata old ifs IFS IFS for place in cities do echo