Bash 的常用语法,控制结构

最近玩弄 Jenkins 较多,构建服务器基本是 Mac OS 和 Linux,虽说有许多现成插件可用,但不敢不说 Execute Shell 这个东西都是即开即用,方便而灵活的。因此不断的要和 Shell 打交道,真正通用的的 Shell 自然是 Bash,在 Mac OS 下可发现自带了 zsh, ksh 和 tcsh,考虑到 Linux 还是 Bash 吧。

本人工作时用的是 Fish Shell,目前相当的脚本语言都可用来写 Shell 脚本,如 PHP, Ruby, Python, Perl,NodeJs 等,只是 Bash 的地位总难被替代,借句话说 Bash 的是拿来 “用” 的,而像 Ruby, Python 等做 Shell 是拿来 “编” 的,再就是 Bash 与 Linux 命令的亲缘性更强。

我也只会在实在用 Bash 太难于表达的时候才用其他脚本语言,如处理日期的运算,因 Mac OS 的 date 和 Linux 的 date 命令差异较大,不得已会选择有较强类型的 Ruby 等。

既然 Bash 要作为一个日常语言,那不妨作个备忘录,记录下那些常用的语法,控制结构。

1. if 条件语句 阅读全文 >>

类别: Linux/Unix. 标签: , . 阅读(196). 评论(0) »

Vim 中使用被选择文本以 Shell 命令执行

在 Vi 中如果想选取文本作为 Shell 命令来执行该如何做呢? 想法的背景是想在 Vi 中编辑 Shell 命令,主要是对参数的修改,然后直接选择执行,而不希望复制再贴到 Terminal 下看结果。方法其实很简单,用不着使用 VimShell,关键这个插件的安装还依赖于另两个插件。方法就是:

1. 可视模式选择文本,选择技巧, 按 v 逐字选择,j 从光标位置到行尾,最有用的莫过于大 V,以行为单位选择,所以按一下大 V 直接选中当前行
2. Shift+; 进到 :'<,'> 提示符
3. 输入 w !sh, 回车即可,要用 fish 就用  w !fish

效果

vi-selection-shell

原理:其实进行的是一个管道操作,把选择的文本内容输送给 sh 执行,相当于

echo "echo 'Hello world'" | sh

如果想把执行结果输出到文件或是剪贴板, 就可借题发挥下了,比如 阅读全文 >>

类别: Vim. 标签: , . 阅读(61). 评论(0) »

调用Windows外壳程序格式化磁盘

看资料介绍说 Windows 2000 以上的 SDK 提供了格式化逻辑驱动器的函数 SHFormatDrive, 这是一个外壳函数(Windows界面操作环境称之为外壳),从 shell32.dll 库导出,调用后会弹出一个格式化对话框,只有用户单击"开始"按钮后格式化才开始,使用时应包含头文件 shlobj.h 

我都照做了,下载安装了 Windows XP SP2 的 SDK, 并配置在了 VC 的 include和lib目录中了,也把新SDK的目录调到了最上面,程序中也包含了 shlobj.h, 而且看到新的 SDK 的 shlobj.h 中确实有 SHFormatDrive 函数原型,可是当我使用 SHFormatDrive 函数编译时总提示我找不到这个符号。不知道发生什么问题了,留待以后有需求时再解决吧,反正就是预编译宏展开时,不是去 include 新的 SDK 的 shlobj.h 文件,include 的是 VC98 中的 shlobj.h 文件。 阅读全文 >>

类别: C++/VB, Windows. 标签: , . 阅读(53). 评论(0) »

如何确保一个 Linux Shell 只有一个运行实例

当我们在 Linux 下写了一个 Shell 做某些操作时,可能在一个终端运行了该脚本还没停止,然而又可能在另一个终端再一次执行了它,会有两个或多个实例在运行。或者是把这个 Shell 安排在 Cron 中,想让它每隔5分钟执行一次,有可能执行时间较长,正在执行当中,下一个5分钟的时刻到了,又在启动一次,这同样也会造成同一个 Shell会同时跑出多个实例来。

同时跑的多个实例就有可能对同一资源的操作造成数据的不可思异。这就要有一种方法来保证同一时刻同一脚本只能有一个实例在运行,借用很多软件的做法,比如 MySQL、Apache 等,在启动的时候生成一个临时的文件向后来者明确指示:有一个实例正在执行,不能执行第二个实例了。等到执行结束(可能被 Kill掉,被 Shutdown等),就把临时文件删除,以后可以运行新的实例了。

可以把某个 Shell 的执行权当作一个独占资源,只有获取锁(没有临时文件,并且建立它)时才有权执行它,执行完后释放锁(把临时文件删除)。

具体实现可在您有这种需求的 Shell 中执行任务之前加上下面这段代码,其中有详尽的注释,很容易体会的。

#定义一个标识脚本正在执行的文件名,尽量让这个临时文件名独特
#避免与他处指定重名,可借鉴C/C++防止重复包含头文件的宏命名法
TMPFILE=/tmp/unmi/backup_oracle_orcl_database.sh.tmp

# BEGIN--检查是否有别的实例在运行,保证同时只能运行一个实例

if[ -e $TMPFILE ]  #判断临时文件是否存在
then                
   echo "Other instance is running!" #存在表明有一个实例在运行
   exit 0           #退出本脚本的执行
else
   touch $TMPFILE   #监时文件若不存在,就用 touch 新建一个
   chmod 600 $TMPFILE #把临时文件属性改为只建立者可读写
fi

#用 trap 命令设置一个对信号的监听器
#程序运行中当监听到信号 0,1,2,3,9,15就会删除临时文件,并退出脚本执行
#比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭
#系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行
#在 Linux 的 shell 下可以运行 trap -l 查看到所以信号
trap "rm -f ${TMPFILE}; exit" 0 1 2 3 9 15

# END--检查是否有别的实例在运行,保证同时只能运行一个实例

#下面是这支 Shell 要完成的任务的代码了

附:在 Red Hat Linux 下执行 trap -l 显示出的所有信号,不同的 Shell 类型显示方式可能不一样。

[root@Linux Home]$ trap -l
 1) SIGHUP      2) SIGINT       3) SIGQUIT       4) SIGILL
 5) SIGTRAP     6) SIGABRT      7) SIGBUS        8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV      12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM      17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP      21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU      25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH     29) SIGIO
30) SIGPWR      31) SIGSYS      33) SIGRTMIN     34) SIGRTMIN+1
35) SIGRTMIN+2  36) SIGRTMIN+3  37) SIGRTMIN+4   38) SIGRTMIN+5
39) SIGRTMIN+6  40) SIGRTMIN+7  41) SIGRTMIN+8   42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12  46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15  50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11  54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7   58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3   62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

类别: Linux/Unix. 标签: , . 阅读(578). 评论(0) »