S : 注意本文讨论的是Bash,而不一定是/bin/sh所链接的那个shell。这里出现的所有代码片段,默认在顶上都添加了#!/bin/bash。
一门自带混淆的语言
while (( $# )); do
case $1 in
-a*)
# Error checking
[[ ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: `$1': missing"
"number specifier" 1>&2; return 1; }
printf %d "${1#-a}" &> /dev/null || { echo "bash:"
"${FUNCNAME[0]}: `$1': invalid number specifier" 1>&2
return 1; }
# Assign array of -aN elements
[[ "$2" ]] && unset -v "$2" && eval $2=("${@:3:${1#-a}}") &&
shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:"
"`$1${2+ }$2': missing argument(s)" 1>&2; return 1; }
;;
-v)
# Assign single value
[[ "$2" ]] && unset -v "$2" && eval $2="$3" &&
shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing"
"argument(s)" 1>&2; return 1; }
;;
*)
echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2
return 1 ;;
esac
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
while (( $# )); do
case $1 in
-a*)
# Error checking
[[ ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: `$1': missing"
"number specifier" 1>&2; return 1; }
printf %d "${1#-a}" &> /dev/null || { echo "bash:"
"${FUNCNAME[0]}: `$1': invalid number specifier" 1>&2
return 1; }
# Assign array of -aN elements
[[ "$2" ]] && unset -v "$2" && eval $2=("${@:3:${1#-a}}") &&
shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:"
"`$1${2+ }$2': missing argument(s)" 1>&2; return 1; }
;;
-v)
# Assign single value
[[ "$2" ]] && unset -v "$2" && eval $2="$3" &&
shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing"
"argument(s)" 1>&2; return 1; }
;;
*)
echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2
return 1 ;;
esac
done
如果你觉得阅读上面的Bash代码,就像阅读段子一样顺畅,那么是时候关掉这个页面,去做别的更有意义的行为,比如去喝个水什么的。
如果你觉得上面的Bash代码犹如鬼画符,并且实际生活中不得不面对它,那么就看下去吧。
Bash变量操作
正式开始正文内容。
想要在一篇文章里,讲述要看懂开篇代码所需的所有知识点,这是不自量力的行为。因此,本文将讲且仅讲Bash中操作变量的方法。所以,即使你看完了这篇文章,你多半还是看不懂开篇的代码。
不过看完这篇文章之后,你对Bash的变量操作会有更为深入的认识。而且更重要的是,Bash之于你,不再是怎么也看不清摸不透。下一次要写脚本的时候,你也将更加坚定地下定决心 —— 人生苦短,我用Python/Ruby。
严格意义上的Bash变量类型
Bash变量只有两种类型,字符串和数组。不过从严格意义上,Bash没有变量类型。Bash中的变量,在运行的时候会被展开成其对应的值(字符串)。你可以把它看做C/C++中的宏定义,或者一些模板语言中的占位符。
一般情况下,变量通过=赋值,注意=两边不要留空格。有些好孩子,已经养成了符号两端留空格的习惯,结果当开始写Bash的时候,他们抓狂了。
要想访问变量,只需在变量名前面添加$,解释器就会对它进行展开。如果该变量并不存在,解释器会把它展开成“”。
me=spacewander
echo $me
echo $who
1
2
3
me=spacewander
echo $me
echo $who
来自命令行的你
作为脚本语言,第一要义当然是要随时随地获取到命令行输入啦。
在Bash中,使用$1可以获取命令行输入的第一个参数,$2可以获取命令行输入的第2个参数,$3可以获取命令行输入的第……
你看,$1到$10000的用法就这么交代完了。Bash还是挺有逻辑的嘛。
顺便一提,$0获取的脚本的名字(其实就是其他语言中的第0个参数),$@获取所有的参数,$#获取参数的数目。记住@和#这两个符号,在Bash这一神秘的符文体系中,前者表示全部参数,后者表示参数的数目。
展开,然后Bomb!
假如Bash变量中含有空白字符,或者含有特殊字符,比如*,展开后会污染到外面的字符串,结果就是Bomb。
一门自带混淆的语言
while (( $# )); do
case $1 in
-a*)
# Error checking
[[ ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: `$1': missing"
"number specifier" 1>&2; return 1; }
printf %d "${1#-a}" &> /dev/null || { echo "bash:"
"${FUNCNAME[0]}: `$1': invalid number specifier" 1>&2
return 1; }
# Assign array of -aN elements
[[ "$2" ]] && unset -v "$2" && eval $2=("${@:3:${1#-a}}") &&
shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:"
"`$1${2+ }$2': missing argument(s)" 1>&2; return 1; }
;;
-v)
# Assign single value
[[ "$2" ]] && unset -v "$2" && eval $2="$3" &&
shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing"
"argument(s)" 1>&2; return 1; }
;;
*)
echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2
return 1 ;;
esac
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
while (( $# )); do
case $1 in
-a*)
# Error checking
[[ ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: `$1': missing"
"number specifier" 1>&2; return 1; }
printf %d "${1#-a}" &> /dev/null || { echo "bash:"
"${FUNCNAME[0]}: `$1': invalid number specifier" 1>&2
return 1; }
# Assign array of -aN elements
[[ "$2" ]] && unset -v "$2" && eval $2=("${@:3:${1#-a}}") &&
shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:"
"`$1${2+ }$2': missing argument(s)" 1>&2; return 1; }
;;
-v)
# Assign single value
[[ "$2" ]] && unset -v "$2" && eval $2="$3" &&
shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing"
"argument(s)" 1>&2; return 1; }
;;
*)
echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2
return 1 ;;
esac
done
如果你觉得阅读上面的Bash代码,就像阅读段子一样顺畅,那么是时候关掉这个页面,去做别的更有意义的行为,比如去喝个水什么的。
如果你觉得上面的Bash代码犹如鬼画符,并且实际生活中不得不面对它,那么就看下去吧。
Bash变量操作
正式开始正文内容。
想要在一篇文章里,讲述要看懂开篇代码所需的所有知识点,这是不自量力的行为。因此,本文将讲且仅讲Bash中操作变量的方法。所以,即使你看完了这篇文章,你多半还是看不懂开篇的代码。
不过看完这篇文章之后,你对Bash的变量操作会有更为深入的认识。而且更重要的是,Bash之于你,不再是怎么也看不清摸不透。下一次要写脚本的时候,你也将更加坚定地下定决心 —— 人生苦短,我用Python/Ruby。
严格意义上的Bash变量类型
Bash变量只有两种类型,字符串和数组。不过从严格意义上,Bash没有变量类型。Bash中的变量,在运行的时候会被展开成其对应的值(字符串)。你可以把它看做C/C++中的宏定义,或者一些模板语言中的占位符。
一般情况下,变量通过=赋值,注意=两边不要留空格。有些好孩子,已经养成了符号两端留空格的习惯,结果当开始写Bash的时候,他们抓狂了。
要想访问变量,只需在变量名前面添加$,解释器就会对它进行展开。如果该变量并不存在,解释器会把它展开成“”。
me=spacewander
echo $me
echo $who
1
2
3
me=spacewander
echo $me
echo $who
来自命令行的你
作为脚本语言,第一要义当然是要随时随地获取到命令行输入啦。
在Bash中,使用$1可以获取命令行输入的第一个参数,$2可以获取命令行输入的第2个参数,$3可以获取命令行输入的第……
你看,$1到$10000的用法就这么交代完了。Bash还是挺有逻辑的嘛。
顺便一提,$0获取的脚本的名字(其实就是其他语言中的第0个参数),$@获取所有的参数,$#获取参数的数目。记住@和#这两个符号,在Bash这一神秘的符文体系中,前者表示全部参数,后者表示参数的数目。
展开,然后Bomb!
假如Bash变量中含有空白字符,或者含有特殊字符,比如*,展开后会污染到外面的字符串,结果就是Bomb。
http://rbhh5rth.weebly.com/
http://asd123123adscsc.weebly.com/
http://rht21gfb1n.weebly.com/
http://svrdf4vb1f.weebly.com/
http://dgbrdfb21g.weebly.com/
http://dv4df4svvvv.weebly.com/
http://fdb5tfgn.weebly.com/
http://dgfdb.weebly.com/
http://dgfdb.weebly.com/
http://sh1gg.weebly.com/
http://db1fg1b.weebly.com/
http://asd123123a4rgfv.weebly.com/
http://rhgt1gn.weebly.com/
http://rhgt1gn.weebly.com/
http://dhg5tgfn.weebly.com/
http://thjjhhmj1.weebly.com/
http://fdh6yjhn.weebly.com/
http://rhjtnbj.weebly.com/
http://fh5t6jhyh.weebly.com/
http://yuk1j.weebly.com/
http://fdh65ythjmn.weebly.com/
http://tjhhnmtyjh.weebly.com/
http://r5tghntjhn.weebly.com/
http://braidin482.weebly.com/
http://braidin482.weebly.com/
http://htryjn.weebly.com/
http://a8jky.weebly.com/
http://bet16bet16h.weebly.com/
http://sungamefb.weebly.com/
http://44www788net.weebly.com/
http://44www841111com.weebly.com/
http://44wwwhongli1com.weebly.com/
http://7jk8.weebly.com/
http://jhytyjuyj.weebly.com/
http://pulgarin15.weebly.com/
http://pulgarin15.weebly.com/
http://sdg5ygs.weebly.com/
http://tjhy5j.weebly.com/
http://sjtuykuk.weebly.com/
http://jdtuykjuyjk.weebly.com/
http://hyujkl.weebly.com/
http://eru76jk.weebly.com/
http://kuymilk.weebly.com/
http://uky6tyhn.weebly.com/
http://6yjhy7j.weebly.com/
http://seoras94387.weebly.com/
http://sg4refg.weebly.com/
http://sdgr2g0.weebly.com/
http://sdb0dfb0333.weebly.com/
http://sg2dfb0f.weebly.com/
http://bdf210fb.weebly.com/
http://4rfdbv00g.weebly.com/
http://trg2bn0.weebly.com/
http://sdgherhfg.weebly.com/
http://dbf0vb0b.weebly.com/
http://rfdh4t4h.weebly.com/
http://rfbth.weebly.com/
http://arefdbfdb.weebly.com/
http://grethfgerb.weebly.com/
http://sgwgrfb.weebly.com/
http://wedgfvbrh.weebly.com/
http://ewdgvfeg.weebly.com/
http://4ergfergf.weebly.com/
http://edsgvf.weebly.com/
http://4werfhdvb.weebly.com/
http://chairwoman86.weebly.com/
http://asd123123adscsc.weebly.com/
http://rht21gfb1n.weebly.com/
http://svrdf4vb1f.weebly.com/
http://dgbrdfb21g.weebly.com/
http://dv4df4svvvv.weebly.com/
http://fdb5tfgn.weebly.com/
http://dgfdb.weebly.com/
http://dgfdb.weebly.com/
http://sh1gg.weebly.com/
http://db1fg1b.weebly.com/
http://asd123123a4rgfv.weebly.com/
http://rhgt1gn.weebly.com/
http://rhgt1gn.weebly.com/
http://dhg5tgfn.weebly.com/
http://thjjhhmj1.weebly.com/
http://fdh6yjhn.weebly.com/
http://rhjtnbj.weebly.com/
http://fh5t6jhyh.weebly.com/
http://yuk1j.weebly.com/
http://fdh65ythjmn.weebly.com/
http://tjhhnmtyjh.weebly.com/
http://r5tghntjhn.weebly.com/
http://braidin482.weebly.com/
http://braidin482.weebly.com/
http://htryjn.weebly.com/
http://a8jky.weebly.com/
http://bet16bet16h.weebly.com/
http://sungamefb.weebly.com/
http://44www788net.weebly.com/
http://44www841111com.weebly.com/
http://44wwwhongli1com.weebly.com/
http://7jk8.weebly.com/
http://jhytyjuyj.weebly.com/
http://pulgarin15.weebly.com/
http://pulgarin15.weebly.com/
http://sdg5ygs.weebly.com/
http://tjhy5j.weebly.com/
http://sjtuykuk.weebly.com/
http://jdtuykjuyjk.weebly.com/
http://hyujkl.weebly.com/
http://eru76jk.weebly.com/
http://kuymilk.weebly.com/
http://uky6tyhn.weebly.com/
http://6yjhy7j.weebly.com/
http://seoras94387.weebly.com/
http://sg4refg.weebly.com/
http://sdgr2g0.weebly.com/
http://sdb0dfb0333.weebly.com/
http://sg2dfb0f.weebly.com/
http://bdf210fb.weebly.com/
http://4rfdbv00g.weebly.com/
http://trg2bn0.weebly.com/
http://sdgherhfg.weebly.com/
http://dbf0vb0b.weebly.com/
http://rfdh4t4h.weebly.com/
http://rfbth.weebly.com/
http://arefdbfdb.weebly.com/
http://grethfgerb.weebly.com/
http://sgwgrfb.weebly.com/
http://wedgfvbrh.weebly.com/
http://ewdgvfeg.weebly.com/
http://4ergfergf.weebly.com/
http://edsgvf.weebly.com/
http://4werfhdvb.weebly.com/
http://chairwoman86.weebly.com/