标签 Bash 下的文章

现如今,我在终端上花的时间更多,尝试在命令行完成比在图形界面更多的工作。随着时间推移,我学了许多 BASH 的技巧。这是一份每个 Linux 用户都应该知道的 BASH 快捷键,这样在终端做事就会快很多。我不会说这是一份完全的 BASH 快捷键清单,但是这足够让你的 BASH shell 操作比以前更快了。学习更快地使用 BASH 不仅节省了更多时间,也让你因为学到了有用的知识而感到自豪。那么,让我们开始吧。

ALT 快捷键

  1. ALT+A – 光标移动到行首。
  2. ALT+B – 光标移动到所在单词词首。
  3. ALT+C – 终止正在运行的命令/进程。与 CTRL+C 相同。
  4. ALT+D – 关闭空的终端(也就是它会关闭没有输入的终端)。也删除光标后的全部字符。
  5. ALT+F – 移动到光标所在单词词末。
  6. ALT+T – 交换最后两个单词。
  7. ALT+U – 将单词内光标后的字母转为大写。
  8. ALT+L – 将单词内光标后的字母转为小写。
  9. ALT+R – 撤销对从历史记录中带来的命令的修改。
    正如你在上面输出所见,我使用反向搜索拉取了一个指令,并更改了那个指令的最后一个字母,并使用 ALT+R 撤销了更改。
  10. ALT+. (注意末尾的点号) – 使用上一条命令的最后一个单词。

如果你想要对多个命令进行相同的操作的话,你可以使用这个快捷键来获取前几个指令的最后一个单词。例如,我需要使用 ls -r 命令输出以文件名逆序排列的目录内容。同时,我也想使用 uname -r 命令来查看我的内核版本。在这两个命令中,相同的单词是 -r 。这就是需要 ALT+. 的地方。快捷键很顺手。首先运行 ls -r 来按文件名逆序输出,然后在其他命令,比如 uname 中使用最后一个单词 -r 。

CTRL 快捷键

  1. CTRL+A – 快速移动到行首。
    我们假设你输入了像下面这样的命令。当你在第 N 行时,你发现在行首字符有一个输入错误
$ gind . -mtime -1 -type

注意到了吗?上面的命令中我输入了 gind 而不是 find 。你可以通过一直按着左箭头键定位到第一个字母然后用 g 替换 f 。或者,仅通过 CTRL+A 或 HOME 键来立刻定位到行首,并替换拼错的单词。这将节省你几秒钟的时间。

  1. CTRL+B – 光标向前移动一个字符。
    这个快捷键可以使光标向前移动一个字符,即光标前的一个字符。或者,你可以使用左箭头键来向前移动一个字符。
  2. CTRL+C – 停止当前运行的命令。
    如果一个命令运行时间过久,或者你误运行了,你可以通过使用 CTRL+C 来强制停止或退出。
  3. CTRL+D – 删除光标后的一个字符。
    如果你的系统退格键无法工作的话,你可以使用 CTRL+D 来删除光标后的一个字符。这个快捷键也可以让你退出当前会话,和 exit 类似。
  4. CTRL+E – 移动到行末。
    当你修正了行首拼写错误的单词,按下 CTRL+E 来快速移动到行末。或者,你也可以使用你键盘上的 END 键。
  5. CTRL+F – 光标向后移动一个字符。
    如果你想将光标向后移动一个字符的话,按 CTRL+F 来替代右箭头键。
  6. CTRL+G – 退出历史搜索模式,不运行命令。
    正如你在上面的截图看到的,我进行了反向搜索,但是我执行命令,并退出了历史搜索模式。
  7. CTRL+H – 删除光标前的一个字符,和退格键相同。
  8. CTRL+J – 和 ENTER/RETURN 键相同。
    回车键不工作?没问题! CTRL+J 或 CTRL+M 可以用来替换回车键。
  9. CTRL+K – 删除光标后的所有字符。
    你不必一直按着删除键来删除光标后的字符。只要按 CTRL+K 就能删除光标后的所有字符。
  10. CTRL+L – 清空屏幕并重新显示当前行。
    别输入 clear 来清空屏幕了。只需按 CTRL+L 即可清空并重新显示当前行。
  11. CTRL+M – 和 CTRL+J 或 RETURN键相同。
  12. CTRL+N – 在命令历史中显示下一行。
    你也可以使用下箭头键。
  13. CTRL+O – 运行你使用反向搜索时发现的命令,即 CTRL+R。
  14. CTRL+P – 显示命令历史的上一条命令。
    你也可以使用上箭头键。
  15. CTRL+R – 向后搜索历史记录(反向搜索)。
  16. CTRL+S – 向前搜索历史记录。
  17. CTRL+T – 交换最后两个字符。
    这是我最喜欢的一个快捷键。假设你输入了 sl 而不是 ls 。没问题!这个快捷键会像下面这张截图一样交换字符。

  1. CTRL+U – 删除光标前的所有字符(从光标后的点删除到行首)。
    这个快捷键立刻删除前面的所有字符。
  2. CTRL+V – 逐字显示输入的下一个字符。
  3. CTRL+W – 删除光标前的一个单词。
    不要和 CTRL+U 弄混了。CTRL+W 不会删除光标前的所有东西,而是只删除一个单词。

  1. CTRL+X – 列出当前单词可能的文件名补全。
  2. CTRL+XX – 移动到行首位置(再移动回来)。
  3. CTRL+Y – 恢复你上一个删除或剪切的条目。
    记得吗,我们在第 21 个命令用 CTRL+W 删除了单词“-al”。你可以使用 CTRL+Y 立刻恢复。

看见了吧?我没有输入“-al”。取而代之,我按了 CTRL+Y 来恢复它。

  1. CTRL+Z – 停止当前的命令。
    你也许很了解这个快捷键。它终止了当前运行的命令。你可以在前台使用 fg 或在后台使用 bg 来恢复它。
  2. CTRL+[ – 和 ESC 键等同。

杂项

  1. !! – 重复上一个命令。
  2. ESC+t – 交换最后两个单词。

这就是我所能想到的了。将来我遇到 Bash 快捷键时我会持续添加的。如果你觉得文章有错的话,请在下方的评论区留言。我会尽快更新。

Cheers!


via: https://www.ostechnix.com/list-useful-bash-keyboard-shortcuts/

作者:SK 译者:heart4lor 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

bash 别名 alias 只不过是指向命令的快捷方式而已。alias 命令允许用户只输入一个单词就运行任意一个命令或一组命令(包括命令选项和文件名)。执行 alias 命令会显示一个所有已定义别名的列表。你可以在 ~/.bashrc 文件中自定义别名。使用别名可以在命令行中减少输入的时间,使工作更流畅,同时增加生产率。

本文通过 30 个 bash shell 别名的实际案例演示了如何创建和使用别名。

bash alias 的那些事

bash shell 中的 alias 命令的语法是这样的:

alias [alias-name[=string]...]

如何列出 bash 别名

输入下面的 alias 命令:

alias

结果为:

alias ..='cd ..'
alias amazonbackup='s3backup'
alias apt-get='sudo apt-get'
...

alias 命令默认会列出当前用户定义好的别名。

如何定义或者创建一个 bash shell 别名

使用下面语法 创建别名:

alias name =value
alias name = 'command'
alias name = 'command arg1 arg2' 
alias name = '/path/to/script' 
alias name = '/path/to/script.pl arg1'

举个例子,输入下面命令并回车就会为常用的 clear(清除屏幕)命令创建一个别名 c:

alias c = 'clear'

然后输入字母 c 而不是 clear 后回车就会清除屏幕了:

c

如何临时性地禁用 bash 别名

下面语法可以临时性地禁用别名:

## path/to/full/command
/usr/bin/clear
## call alias with a backslash ##
\c
## use /bin/ls command and avoid ls alias ##
command ls

如何删除 bash 别名

使用 unalias 命令来删除别名。其语法为:

unalias aliasname
unalias foo

例如,删除我们之前创建的别名 c:

unalias c

你还需要用文本编辑器删掉 ~/.bashrc 文件 中的别名定义(参见下一部分内容)。

如何让 bash shell 别名永久生效

别名 c 在当前登录会话中依然有效。但当你登出或重启系统后,别名 c 就没有了。为了防止出现这个问题,将别名定义写入 ~/.bashrc file 中,输入:

vi ~/.bashrc

输入下行内容让别名 c 对当前用户永久有效:

alias c = 'clear'

保存并关闭文件就行了。系统级的别名(也就是对所有用户都生效的别名)可以放在 /etc/bashrc 文件中。请注意,alias 命令内建于各种 shell 中,包括 ksh,tcsh/csh,ash,bash 以及其他 shell。

关于特权权限判断

可以将下面代码加入 ~/.bashrc:

# if user is not root, pass all commands via sudo #
if [ $UID -ne 0 ]; then
    alias reboot='sudo reboot'
    alias update='sudo apt-get upgrade'
fi

定义与操作系统类型相关的别名

可以将下面代码加入 ~/.bashrc 使用 case 语句:

### Get os name via uname ###
_myos="$(uname)"

### add alias as per os using $_myos ###
case $_myos in
   Linux) alias foo='/path/to/linux/bin/foo';;
   FreeBSD|OpenBSD) alias foo='/path/to/bsd/bin/foo' ;;
   SunOS) alias foo='/path/to/sunos/bin/foo' ;;
   *) ;;
esac

30 个 bash shell 别名的案例

你可以定义各种类型的别名来节省时间并提高生产率。

1:控制 ls 命令的输出

ls 命令列出目录中的内容 而你可以对输出进行着色:

## Colorize the ls output ##
alias ls = 'ls --color=auto'

## Use a long listing format ##
alias ll = 'ls -la'

## Show hidden files ##
alias l.= 'ls -d . .. .git .gitignore .gitmodules .travis.yml --color=auto'

2:控制 cd 命令的行为

## get rid of command not found ##
alias cd..= 'cd ..'

## a quick way to get out of current directory ##
alias ..= 'cd ..'
alias ...= 'cd ../../../'
alias ....= 'cd ../../../../'
alias .....= 'cd ../../../../'
alias .4= 'cd ../../../../'
alias .5= 'cd ../../../../..'

3:控制 grep 命令的输出

grep 命令是一个用于在纯文本文件中搜索匹配正则表达式的行的命令行工具:

## Colorize the grep command output for ease of use (good for log files)##
alias grep = 'grep --color=auto'
alias egrep = 'egrep --color=auto'
alias fgrep = 'fgrep --color=auto'

4:让计算器默认开启 math 库

alias bc = 'bc -l'

4:生成 sha1 数字签名

alias sha1 = 'openssl sha1'

5:自动创建父目录

mkdir 命令 用于创建目录:

alias mkdir = 'mkdir -pv'

6:为 diff 输出着色

你可以使用 diff 来一行行第比较文件 而一个名为 colordiff 的工具可以为 diff 输出着色:

# install colordiff package :)
alias diff = 'colordiff'

7:让 mount 命令的输出更漂亮,更方便人类阅读

alias mount = 'mount |column -t'

8:简化命令以节省时间

# handy short cuts #
alias h = 'history' 
alias j = 'jobs -l'

9:创建一系列新命令

alias path = 'echo -e ${PATH//:/\\n}'
alias now = 'date +"%T"'
alias nowtime =now
alias nowdate = 'date +"%d-%m-%Y"'

10:设置 vim 为默认编辑器

alias vi = vim
alias svi = 'sudo vi'
alias vis = 'vim "+set si"'
alias edit = 'vim'

11:控制网络工具 ping 的输出

# Stop after sending count ECHO_REQUEST packets #
alias ping = 'ping -c 5'

# Do not wait interval 1 second, go fast #
alias fastping = 'ping -c 100 -i.2'

12:显示打开的端口

使用 netstat 命令 可以快速列出服务区中所有的 TCP/UDP 端口:

alias ports = 'netstat -tulanp'

13:唤醒休眠的服务器

Wake-on-LAN (WOL) 是一个以太网标准,可以通过网络消息来开启服务器。你可以使用下面别名来快速激活 nas 设备 以及服务器:

## replace mac with your actual server mac address #
alias wakeupnas01 = '/usr/bin/wakeonlan 00:11:32:11:15:FC'
alias wakeupnas02 = '/usr/bin/wakeonlan 00:11:32:11:15:FD'
alias wakeupnas03 = '/usr/bin/wakeonlan 00:11:32:11:15:FE'

14:控制防火墙 (iptables) 的输出

Netfilter 是一款 Linux 操作系统上的主机防火墙。它是 Linux 发行版中的一部分,且默认情况下是激活状态。这里列出了大多数 Liux 新手防护入侵者最常用的 iptables 方法。

## shortcut for iptables and pass it via sudo#
alias ipt = 'sudo /sbin/iptables'

# display all rules #
alias iptlist = 'sudo /sbin/iptables -L -n -v --line-numbers'
alias iptlistin = 'sudo /sbin/iptables -L INPUT -n -v --line-numbers'
alias iptlistout = 'sudo /sbin/iptables -L OUTPUT -n -v --line-numbers'
alias iptlistfw = 'sudo /sbin/iptables -L FORWARD -n -v --line-numbers'
alias firewall =iptlist

15:使用 curl 调试 web 服务器 / CDN 上的问题

# get web server headers #
alias header = 'curl -I'

# find out if remote server supports gzip / mod_deflate or not #
alias headerc = 'curl -I --compress'

16:增加安全性

# do not delete / or prompt if deleting more than 3 files at a time #
alias rm = 'rm -I --preserve-root'

# confirmation #
alias mv = 'mv -i'
alias cp = 'cp -i'
alias ln = 'ln -i' 

# Parenting changing perms on / #
alias chown = 'chown --preserve-root'
alias chmod = 'chmod --preserve-root'
alias chgrp = 'chgrp --preserve-root'

17:更新 Debian Linux 服务器

apt-get 命令 用于通过因特网安装软件包 (ftp 或 http)。你也可以一次性升级所有软件包:

# distro specific - Debian / Ubuntu and friends #
# install with apt-get
alias apt-get= "sudo apt-get"
alias updatey = "sudo apt-get --yes"

# update on one command
alias update = 'sudo apt-get update && sudo apt-get upgrade'

18:更新 RHEL / CentOS / Fedora Linux 服务器

yum 命令 是 RHEL / CentOS / Fedora Linux 以及其他基于这些发行版的 Linux 上的软件包管理工具:

## distrp specifc RHEL/CentOS ##
alias update = 'yum update'
alias updatey = 'yum -y update'

19:优化 sudo 和 su 命令

# become root #
alias root = 'sudo -i' 
alias su = 'sudo -i'

20:使用 sudo 执行 halt/reboot 命令

shutdown 命令 会让 Linux / Unix 系统关机:

# reboot / halt / poweroff
alias reboot = 'sudo /sbin/reboot'
alias poweroff = 'sudo /sbin/poweroff' 
alias halt = 'sudo /sbin/halt'
alias shutdown = 'sudo /sbin/shutdown'

21:控制 web 服务器

# also pass it via sudo so whoever is admin can reload it without calling you #
alias nginxreload = 'sudo /usr/local/nginx/sbin/nginx -s reload' 
alias nginxtest = 'sudo /usr/local/nginx/sbin/nginx -t'
alias lightyload = 'sudo /etc/init.d/lighttpd reload' 
alias lightytest = 'sudo /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf -t'
alias httpdreload = 'sudo /usr/sbin/apachectl -k graceful' 
alias httpdtest = 'sudo /usr/sbin/apachectl -t && /usr/sbin/apachectl -t -D DUMP_VHOSTS'

22:与备份相关的别名

# if cron fails or if you want backup on demand just run these commands #
# again pass it via sudo so whoever is in admin group can start the job #
# Backup scripts #
alias backup = 'sudo /home/scripts/admin/scripts/backup/wrapper.backup.sh --type local --taget /raid1/backups' 
alias nasbackup = 'sudo /home/scripts/admin/scripts/backup/wrapper.backup.sh --type nas --target nas01'
alias s3backup = 'sudo /home/scripts/admin/scripts/backup/wrapper.backup.sh --type nas --target nas01 --auth /home/scripts/admin/.authdata/amazon.keys'
alias rsnapshothourly = 'sudo /home/scripts/admin/scripts/backup/wrapper.rsnapshot.sh --type remote --target nas03 --auth /home/scripts/admin/.authdata/ssh.keys --config /home/scripts/admin/scripts/backup/config/adsl.conf'
alias rsnapshotdaily = 'sudo /home/scripts/admin/scripts/backup/wrapper.rsnapshot.sh --type remote --target nas03 --auth /home/scripts/admin/.authdata/ssh.keys --config /home/scripts/admin/scripts/backup/config/adsl.conf'
alias rsnapshotweekly = 'sudo /home/scripts/admin/scripts/backup/wrapper.rsnapshot.sh --type remote --target nas03 --auth /home/scripts/admin/.authdata/ssh.keys --config /home/scripts/admin/scripts/backup/config/adsl.conf' 
alias rsnapshotmonthly = 'sudo /home/scripts/admin/scripts/backup/wrapper.rsnapshot.sh --type remote --target nas03 --auth /home/scripts/admin/.authdata/ssh.keys --config /home/scripts/admin/scripts/backup/config/adsl.conf' 
alias amazonbackup =s3backup

23:桌面应用相关的别名 - 按需播放的 avi/mp3 文件

## play video files in a current directory ##
# cd ~/Download/movie-name
# playavi or vlc
alias playavi = 'mplayer *.avi' 
alias vlc = 'vlc *.avi' 

# play all music files from the current directory #
alias playwave = 'for i in *.wav; do mplayer "$i"; done'
alias playogg = 'for i in *.ogg; do mplayer "$i"; done'
alias playmp3 = 'for i in *.mp3; do mplayer "$i"; done'

# play files from nas devices #
alias nplaywave = 'for i in /nas/multimedia/wave/*.wav; do mplayer "$i"; done'
alias nplayogg = 'for i in /nas/multimedia/ogg/*.ogg; do mplayer "$i"; done' 
alias nplaymp3 = 'for i in /nas/multimedia/mp3/*.mp3; do mplayer "$i"; done'

# shuffle mp3/ogg etc by default # 
alias music = 'mplayer --shuffle *'

24:设置系统管理相关命令的默认网卡

vnstat 一款基于终端的网络流量检测器。dnstop 是一款分析 DNS 流量的终端工具。tcptrack 和 iftop 命令显示 TCP/UDP 连接方面的信息,它监控网卡并显示其消耗的带宽。

## All of our servers eth1 is connected to the Internets via vlan / router etc ##
alias dnstop = 'dnstop -l 5 eth1'
alias vnstat = 'vnstat -i eth1'
alias iftop = 'iftop -i eth1' 
alias tcpdump = 'tcpdump -i eth1' 
alias ethtool = 'ethtool eth1' 

# work on wlan0 by default #
# Only useful for laptop as all servers are without wireless interface
alias iwconfig = 'iwconfig wlan0'

25:快速获取系统内存,cpu 使用,和 gpu 内存相关信息

## pass options to free ##
alias meminfo = 'free -m -l -t' 

## get top process eating memory
alias psmem = 'ps auxf | sort -nr -k 4' 
alias psmem10 = 'ps auxf | sort -nr -k 4 | head -10'

## get top process eating cpu ##
alias pscpu = 'ps auxf | sort -nr -k 3'
alias pscpu10 = 'ps auxf | sort -nr -k 3 | head -10' 

## Get server cpu info ##
alias cpuinfo = 'lscpu'

## older system use /proc/cpuinfo ##
##alias cpuinfo='less /proc/cpuinfo' ##

## get GPU ram on desktop / laptop##
alias gpumeminfo = 'grep -i --color memory /var/log/Xorg.0.log'

26:控制家用路由器

curl 命令可以用来 重启 Linksys 路由器。

# Reboot my home Linksys WAG160N / WAG54 / WAG320 / WAG120N Router / Gateway from *nix.
alias rebootlinksys = "curl -u 'admin:my-super-password' 'http://192.168.1.2/setup.cgi?todo=reboot'"

# Reboot tomato based Asus NT16 wireless bridge
alias reboottomato = "ssh [email protected] /sbin/reboot"

27:wget 默认断点续传

GNU wget 是一款用来从 web 下载文件的自由软件。它支持 HTTP,HTTPS,以及 FTP 协议,而且它也支持断点续传:

## this one saved by butt so many times ##
alias wget = 'wget -c'

28:使用不同浏览器来测试网站

## this one saved by butt so many times ##
alias ff4 = '/opt/firefox4/firefox' 
alias ff13 = '/opt/firefox13/firefox' 
alias chrome = '/opt/google/chrome/chrome' 
alias opera = '/opt/opera/opera'

#default ff
alias ff =ff13

#my default browser
alias browser =chrome

29:关于 ssh 别名的注意事项

不要创建 ssh 别名,代之以 ~/.ssh/config 这个 OpenSSH SSH 客户端配置文件。它的选项更加丰富。下面是一个例子:

Host server10
 Hostname 1.2.3.4
 IdentityFile ~/backups/.ssh/id_dsa
 user foobar
 Port 30000
 ForwardX11Trusted yes
 TCPKeepAlive yes

然后你就可以使用下面语句连接 server10 了:

$ ssh server10

30:现在该分享你的别名了

## set some other defaults ##
alias df = 'df -H'
alias du = 'du -ch'

# top is atop, just like vi is vim
alias top = 'atop'

## nfsrestart - must be root ##
## refresh nfs mount / cache etc for Apache ##
alias nfsrestart = 'sync && sleep 2 && /etc/init.d/httpd stop && umount netapp2:/exports/http && sleep 2 && mount -o rw,sync,rsize=32768,wsize=32768,intr,hard,proto=tcp,fsc natapp2:/exports /http/var/www/html && /etc/init.d/httpd start'

## Memcached server status ##
alias mcdstats = '/usr/bin/memcached-tool 10.10.27.11:11211 stats'
alias mcdshow = '/usr/bin/memcached-tool 10.10.27.11:11211 display'

## quickly flush out memcached server ##
alias flushmcd = 'echo "flush_all" | nc 10.10.27.11 11211'

## Remove assets quickly from Akamai / Amazon cdn ##
alias cdndel = '/home/scripts/admin/cdn/purge_cdn_cache --profile akamai'
alias amzcdndel = '/home/scripts/admin/cdn/purge_cdn_cache --profile amazon'

## supply list of urls via file or stdin
alias cdnmdel = '/home/scripts/admin/cdn/purge_cdn_cache --profile akamai --stdin' 
alias amzcdnmdel = '/home/scripts/admin/cdn/purge_cdn_cache --profile amazon --stdin'

总结

本文总结了 *nix bash 别名的多种用法:

  1. 为命令设置默认的参数(例如通过 alias ethtool='ethtool eth0' 设置 ethtool 命令的默认参数为 eth0)。
  2. 修正错误的拼写(通过 alias cd..='cd ..'让 cd.. 变成 cd ..)。
  3. 缩减输入。
  4. 设置系统中多版本命令的默认路径(例如 GNU/grep 位于 /usr/local/bin/grep 中而 Unix grep 位于 /bin/grep 中。若想默认使用 GNU grep 则设置别名 grep='/usr/local/bin/grep' )。
  5. 通过默认开启命令(例如 rm,mv 等其他命令)的交互参数来增加 Unix 的安全性。
  6. 为老旧的操作系统(比如 MS-DOS 或者其他类似 Unix 的操作系统)创建命令以增加兼容性(比如 alias del=rm)。

我已经分享了多年来为了减少重复输入命令而使用的别名。若你知道或使用的哪些 bash/ksh/csh 别名能够减少输入,请在留言框中分享。


via: https://www.cyberciti.biz/tips/bash-aliases-mac-centos-linux-unix.html

作者:nixCraft 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

所谓“子字符串”就是出现在其它字符串内的字符串。 比如 “3382” 就是 “this is a 3382 test” 的子字符串。 我们有多种方法可以从中把数字或指定部分字符串抽取出来。

How to Extract substring in Bash Shell on Linux or Unix

本文会向你展示在 bash shell 中如何获取或者说查找出子字符串。

在 Bash 中抽取子字符串

其语法为:

## 格式 ## 
${parameter:offset:length} 

子字符串扩展是 bash 的一项功能。它会扩展成 parameter 值中以 offset 为开始,长为 length 个字符的字符串。 假设, $u 定义如下:

## 定义变量 u ##
u="this is a test"

那么下面参数的子字符串扩展会抽取出子字符串:

var="${u:10:4}"
echo "${var}"

结果为:

test

其中这些参数分别表示:

  • 10 : 偏移位置
  • 4 : 长度

使用 IFS

根据 bash 的 man 页说明:

IFS (内部字段分隔符)用于在扩展后进行单词分割,并用内建的 read 命令将行分割为词。默认值是。

另一种 POSIX 就绪 POSIX ready 的方案如下:

u="this is a test"
set -- $u
echo "$1"
echo "$2"
echo "$3"
echo "$4"

输出为:

this
is
a
test

下面是一段 bash 代码,用来从 Cloudflare cache 中去除带主页的 url。

#!/bin/bash
####################################################
## Author - Vivek Gite {https://www.cyberciti.biz/}
## Purpose - Purge CF cache
## License - Under GPL ver 3.x+
####################################################
## set me first ##
zone_id="YOUR_ZONE_ID_HERE"
api_key="YOUR_API_KEY_HERE"
email_id="YOUR_EMAIL_ID_HERE"

## hold data ##
home_url=""
amp_url=""
urls="$@"

## Show usage 
[ "$urls" == "" ] && { echo "Usage: $0 url1 url2 url3"; exit 1; }

## Get home page url as we have various sub dirs on domain
## /tips/
## /faq/

get_home_url(){
    local u="$1"
    IFS='/'
    set -- $u
    echo "${1}${IFS}${IFS}${3}${IFS}${4}${IFS}"
}

echo
echo "Purging cache from Cloudflare。.。"
echo
for u in $urls
do
     home_url="$(get_home_url $u)"
     amp_url="${u}amp/"
     curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${zone_id}/purge_cache" \
          -H "X-Auth-Email: ${email_id}" \
          -H "X-Auth-Key: ${api_key}" \
          -H "Content-Type: application/json" \
          --data "{\"files\":[\"${u}\",\"${amp_url}\",\"${home_url}\"]}"
     echo
done
echo

它的使用方法为:

~/bin/cf.clear.cache https://www.cyberciti.biz/faq/bash-for-loop/ https://www.cyberciti.biz/tips/linux-security.html

借助 cut 命令

可以使用 cut 命令来将文件中每一行或者变量中的一部分删掉。它的语法为:

u="this is a test"
echo "$u" | cut -d' ' -f 4
echo "$u" | cut --delimiter=' ' --fields=4
##########################################
## WHERE
##   -d' ' : Use a whitespace as delimiter
##   -f 4  : Select only 4th field
##########################################
var="$(cut -d' ' -f 4 <<< $u)"
echo "${var}"

想了解更多请阅读 bash 的 man 页:

man bash
man cut

另请参见: Bash String Comparison: Find Out IF a Variable Contains a Substring


via: https://www.cyberciti.biz/faq/how-to-extract-substring-in-bash/

作者:Vivek Gite 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过一些简单的 Google 搜索,即使是编程入门者也可以尝试编写代码将以往枯燥和冗长的任务自动化。

 title=

我前几天写了一个脚本。对于一些人来说,这句话听起来没什么了不起的。而对于另一些人来说,这句话意义重大。要知道,我不是一个程序员,而是一个作家。

我需要解决什么?

我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面,并移动到一个已按照我文件分类的需要进行了结构化的目录时,一位作家同事给我提了建议:“不就是写个脚本的事吗?”

我心想:“就写个脚本?”——说得好像这是世界上最容易做的事情一样。

Google 是如何解救我的?

同事的问题促使我思考,并且经过思考后,我进行了 Google 搜索。

Linux 上使用的是什么脚本编程语言?

这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我听说过 Bash 。呃,我要分类的文件中有一个里面就有 Bash,那无处不在的 #!/bin/bash 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。

这引导我进行了下一个 Google 搜索。

如何从一个 URL 下载 zip 文件?

那确实是我的基本任务。我有一个带有 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在这个收获的推动下,我写了最简单的脚本:

#!/bin/sh

curl http://rather.long.url | tar -xz -C my_directory --strip-components=1

我迫不及待地运行看看。但我发现一个问题: URL 是会变的,根据我要访问的文件的分组不同而不同。我有新的问题需要解决,这使我进行了下一轮搜索。

参数如何传递给 Bash 脚本?

我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 $1、$2 等等来替换我在命令行中运行脚本时输入的内容。比如:

bash myscript.sh http://rather.long.url my_directory

这就好多了。一切如我所愿,灵活,实用。最重要的是我只要输入一条简短的命令就可以节省 30 分钟无聊的复制、粘贴工作。这个早上的时间花得值得。

然后我发现还有一个问题:我很健忘,并且我知道我几个月才运行一次这个脚本。这留给我两个疑问:

  • 我要如何记得运行脚本时输入什么(URL 先,还是目录先)?
  • 如果我被货车撞了,其它作家如何知道该怎样运行我的脚本?

我需要一个使用说明 —— 如果我使用不正确,则脚本会提示。比如:

usage: bash yaml-fetch.sh <'snapshot_url'> <directory>

否则,则直接运行脚本。我的下一个搜索是:

如何在 Bash 脚本里使用 “if/then/else”?

幸运的是,我已经知道编程中 if/then/else 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 echo 打印。我的最终成果如下:

#!/bin/sh

URL=$1
DIRECTORY=$2

if [ $# -eq 0 ];
 then
 echo "usage: bash yaml-fetch.sh <'snapshot_url'> <directory>".
 else

# 如果目录不存在则创建它
 echo 'create directory'

 mkdir $DIRECTORY

 # 下载并解压 yaml 文件
 echo 'fetch and untar the yaml files'

 curl $URL | tar -xz -C $DIRECTORY --strip-components=1
fi

Google 和脚本编程如何颠覆我的世界?

好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本之外)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑时,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了可以一直拥有并可以简化其它任务的新技能,这是我之前所没有的。

别止步于第一个脚本(或者编程的第一步)。这是一个技能,和其它的技能并无不同,有大量的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码的需求,并对它进行分支、合并、修复错误。但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这样的一个小脚本和小小的自信就能够让你启程脚本编程之路。

(题图: opensource.com)


作者简介:

Sandra McCann 是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。桑德拉目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。


via: https://opensource.com/article/17/5/how-i-learned-bash-scripting

作者:Sandra McCann 译者:xllc 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

IDE(集成开发环境)就是这样一个软件,它为了最大化程序员生产效率,提供了很多编程所需的设施和组件。 IDE 将所有开发工作集中到一个程序中,使得程序员可以编写、修改、编译、部署以及调试程序。

在这篇文章中,我们会介绍如何通过使用 bash-support vim 插件将 Vim 编辑器安装和配置 为一个编写 Bash 脚本的 IDE。

什么是 bash-support.vim 插件?

bash-support 是一个高度定制化的 vim 插件,它允许你插入:文件头、补全语句、注释、函数、以及代码块。它也使你可以进行语法检查、使脚本可执行、一键启动调试器;而完成所有的这些而不需要关闭编辑器。

它使用快捷键(映射),通过有组织地、一致的文件内容编写/插入,使得 bash 脚本编程变得有趣和愉快。

插件当前版本是 4.3,4.0 版本 重写了之前的 3.12.1 版本,4.0 及之后的版本基于一个全新的、更强大的、和之前版本模板语法不同的模板系统。

如何在 Linux 中安装 Bash-support 插件

用下面的命令下载最新版本的 bash-support 插件:

$ cd Downloads
$ curl http://www.vim.org/scripts/download_script.php?src_id=24452 >bash-support.zip

按照如下步骤安装;在你的主目录创建 .vim 目录(如果它不存在的话),进入该目录并提取 bash-support.zip 内容:

$ mkdir ~/.vim
$ cd .vim
$ unzip ~/Downloads/bash-support.zip

下一步,在 .vimrc 文件中激活它:

$ vi ~/.vimrc

并插入下面一行:

filetype plug-in on   
set number   # 可选,增加这行以在 vim 中显示行号

如何在 Vim 编辑器中使用 Bash-support 插件

为了简化使用,通常使用的结构和特定操作可以分别通过键映射来插入/执行。 ~/.vim/doc/bashsupport.txt 和 ~/.vim/bash-support/doc/bash-hotkeys.pdf 或者 ~/.vim/bash-support/doc/bash-hotkeys.tex 文件中介绍了映射。

重要:

  1. 所有映射(\+字符 组合)都是针对特定文件类型的:为了避免和其它插件的映射冲突,它们只适用于 sh 文件。
  2. 使用键映射的时候打字速度也有关系,引导符 \ 和后面字符的组合要在特定短时间内才能识别出来(很可能少于 3 秒 - 基于假设)。

下面我们会介绍和学习使用这个插件一些显著的功能:

如何为新脚本自动生成文件头

看下面的示例文件头,为了要在你所有的新脚本中自动创建该文件头,请按照以下步骤操作。

脚本示例文件头选项

脚本示例文件头选项

首先设置你的个人信息(作者名称、作者参考、组织、公司等)。在一个 Bash 缓冲区(像下面这样打开一个测试脚本)中使用映射 \ntw 启动模板设置向导。

选中选项 1 设置个性化文件,然后按回车键。

$ vi test.sh

在脚本文件中设置个性化信息

在脚本文件中设置个性化信息

之后,再次输入回车键。然后再一次选中选项 1 设置个性化文件的路径并输入回车。

设置个性化文件路径

设置个性化文件路径

设置向导会把目标文件 .vim/bash-support/rc/personal.templates 拷贝到 .vim/templates/personal.templates,打开并编辑它,在这里你可以输入你的信息。

按 i 键像截图那样在单引号中插入合适的值。

在脚本文件头添加信息

在脚本文件头添加信息

一旦你设置了正确的值,输入 :wq 保存并退出文件。关闭 Bash 测试脚本,打开另一个脚本来测试新的配置。现在文件头中应该有和下面截图类似的你的个人信息:

$ vi test2.sh

自动添加文件头到脚本

自动添加文件头到脚本

添加 Bash-support 插件帮助信息

为此,在 Vim 命令行输入下面的命令并按回车键,它会创建 .vim/doc/tags 文件:

:helptags $HOME/.vim/doc/

在 Vi 编辑器添加插件帮助

在 Vi 编辑器添加插件帮助

如何在 Shell 脚本中插入注释

要插入一个块注释,在普通模式下输入 \cfr:

添加注释到脚本

添加注释到脚本

如何在 Shell 脚本中插入语句

下面是一些用于插入语句的键映射(n – 普通模式, i – 插入模式,v 可视模式):

  1. \sc – case in … esac (n, i)
  2. \sei – elif then (n, i)
  3. \sf – for in do done (n, i, v)
  4. \sfo – for ((…)) do done (n, i, v)
  5. \si – if then fi (n, i, v)
  6. \sie – if then else fi (n, i, v)
  7. \ss – select in do done (n, i, v)
  8. \su – until do done (n, i, v)
  9. \sw – while do done (n, i, v)
  10. \sfu – function (n, i, v)
  11. \se – echo -e "…" (n, i, v)
  12. \sp – printf "…" (n, i, v)
  13. \sa – 数组元素, ${.[.]} (n, i, v) 和其它更多的数组功能。

插入一个函数和函数头

输入 \sfu 添加一个新的空函数,然后添加函数名并按回车键创建它。之后,添加你的函数代码。

在脚本中插入新函数

在脚本中插入新函数

为了给上面的函数创建函数头,输入 \cfu,输入函数名称,按回车键并填入合适的值(名称、介绍、参数、返回值):

在脚本中创建函数头

在脚本中创建函数头

更多关于添加 Bash 语句的例子

下面是一个使用 \si 插入一条 if 语句的例子:

在脚本中插入语句

在脚本中插入语句

下面的例子显示使用 \se 添加一条 echo 语句:

在脚本中添加 echo 语句

在脚本中添加 echo 语句

如何在 Vi 编辑器中使用运行操作

下面是一些运行操作键映射的列表:

  1. \rr – 更新文件,运行脚本(n, i)
  2. \ra – 设置脚本命令行参数 (n, i)
  3. \rc – 更新文件,检查语法 (n, i)
  4. \rco – 语法检查选项 (n, i)
  5. \rd – 启动调试器(n, i)
  6. \re – 使脚本可/不可执行(*) (n, i)

使脚本可执行

编写完脚本后,保存它然后输入 \re 和回车键使它可执行。

使脚本可执行

使脚本可执行

如何在 Bash 脚本中使用预定义代码片段

预定义代码片段是为了特定目的包含了已写好代码的文件。为了添加代码段,输入 \nr 和 \nw 读/写预定义代码段。输入下面的命令列出默认的代码段:

$ .vim/bash-support/codesnippets/

代码段列表

代码段列表

为了使用代码段,例如 free-software-comment,输入 \nr 并使用自动补全功能选择它的名称,然后输入回车键:

添加代码段到脚本

添加代码段到脚本

创建自定义预定义代码段

可以在 ~/.vim/bash-support/codesnippets/ 目录下编写你自己的代码段。另外,你还可以从你正常的脚本代码中创建你自己的代码段:

  1. 选择你想作为代码段的部分代码,然后输入 \nw 并给它一个相近的文件名。
  2. 要读入它,只需要输入 \nr 然后使用文件名就可以添加你自定义的代码段。

在当前光标处查看内建和命令帮助

要显示帮助,在普通模式下输入:

  1. \hh – 内建帮助
  2. \hm – 命令帮助

查看内建命令帮助

查看内建命令帮助

更多参考资料,可以查看文件:

~/.vim/doc/bashsupport.txt  #在线文档的副本
~/.vim/doc/tags

就是这些啦,在这篇文章中,我们介绍了在 Linux 中使用 Bash-support 插件安装和配置 Vim 为一个 Bash-IDE 的步骤。快去发现这个插件其它令人兴奋的功能吧,一定要在评论中和我们分享哦。


作者简介:

Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者、Linux 系统管理员、网络开发人员,现在也是 TecMint 的内容创作者,她喜欢和电脑一起工作,坚信共享知识。


via: http://www.tecmint.com/use-vim-as-bash-ide-using-bash-support-in-linux/

作者:Aaron Kili 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出