bash里面 ${0:12}是什么意思?

sh/bash/dash/ksh/zsh等Shell脚本
头像
ksun
帖子: 18
注册时间: 2009-11-24 18:58

bash里面 ${0:12}是什么意思?

#1

帖子 ksun » 2009-11-24 19:16

rt

google未果,谁能告诉我下? :em06
珍爱生命,远离电脑
头像
ksun
帖子: 18
注册时间: 2009-11-24 18:58

Re: bash里面 ${0:12}是什么意思?

#2

帖子 ksun » 2009-11-24 19:27

是看一段以前的代码,不知道这开始的这一句是干什么的

google了以下 貌似bash里面没有这样的语法

不知道是怎么回事了
珍爱生命,远离电脑
头像
pcbird
帖子: 2337
注册时间: 2008-12-19 13:44
来自: 东8区

Re: bash里面 ${0:12}是什么意思?

#3

帖子 pcbird » 2009-11-24 19:47

我查到的有一个是
str = 12345
echo ${str:2}

345

(1)${变量1:位置}
(说明一下,默认是从左边开始,如果“位置”为负数,则是从右边的第“位置”个字符开始,并且第一个位置为0;从“位置”开始取子串到最后)
例:
str1=abcABCabc123ABC
echo ${str1:(-3)}#会输出ABC

关注
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: bash里面 ${0:12}是什么意思?

#4

帖子 roylez » 2009-11-24 19:53

这东西,可以说是bash本身最天书的部分了。至今没有全部弄明白过。
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
头像
ksun
帖子: 18
注册时间: 2009-11-24 18:58

Re: bash里面 ${0:12}是什么意思?

#5

帖子 ksun » 2009-11-24 19:54

bash的man手册里面有这样的模式叫做Parameter Expansion ${parameter:offset}

可是跟${0:12}好像还是不一样 :em20
pcbird 写了:我查到的有一个是
str = 12345
echo ${str:2}

345

(1)${变量1:位置}
(说明一下,默认是从左边开始,如果“位置”为负数,则是从右边的第“位置”个字符开始,并且第一个位置为0;从“位置”开始取子串到最后)
例:
str1=abcABCabc123ABC
echo ${str1:(-3)}#会输出ABC

关注
珍爱生命,远离电脑
头像
xzap
帖子: 256
注册时间: 2006-08-24 21:25

Re: bash里面 ${0:12}是什么意思?

#6

帖子 xzap » 2009-11-24 19:55

$0应该就是运行的脚本的文件名,然后后的:12是从第12位字符之后截取字符串。
${0:12}的意思就是截取运行脚本的文件名的第12个字符后的字符串
用途可能比较特殊吧
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
联系:

Re: bash里面 ${0:12}是什么意思?

#7

帖子 pityonline » 2009-11-24 20:09

楼主是不是方便多贴上点代码来,然后问中间这一段是什么意思,这样不是很好猜……
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
头像
ksun
帖子: 18
注册时间: 2009-11-24 18:58

Re: bash里面 ${0:12}是什么意思?

#8

帖子 ksun » 2009-11-24 20:11

谢谢哈,好像就是这样用的,

我刚才找到代码的主人了,他一顿沉吟。。。 说还是参考你的解释吧 :em04
xzap 写了:$0应该就是运行的脚本的文件名,然后后的:12是从第12位字符之后截取字符串。
${0:12}的意思就是截取运行脚本的文件名的第12个字符后的字符串
用途可能比较特殊吧
珍爱生命,远离电脑
头像
ksun
帖子: 18
注册时间: 2009-11-24 18:58

Re: bash里面 ${0:12}是什么意思?

#9

帖子 ksun » 2009-11-24 20:26

这个用法应该还是符合Parameter Expansion ${parameter:offset}的

不过对bash里面变量的认识还是不足,原来以为要显示设置的类似$name的形式才是变量

现在看来0,1。。。,9等数字应该也是bash里面的变量名了,不过访问方式是$1,$2等等而已

晕,看样子shell脚本还是要好好看看了,不然不好意思给人讲熟悉linux了 :em20
珍爱生命,远离电脑
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: bash里面 ${0:12}是什么意思?

#10

帖子 tusooa » 2009-12-09 21:13

roylez 写了:这东西,可以说是bash本身最天书的部分了。至今没有全部弄明白过。
Python Code:

代码: 全选

foo='123456789'
foo[1:]
foo[-1:]
Bash Code:

代码: 全选

foo=123456789
echo ${foo:1}
echo ${foo:-1}

代码: 全选

] ls -ld //
头像
xyy_xx
帖子: 344
注册时间: 2008-09-17 13:37
系统: arch|centos

Re: bash里面 ${0:12}是什么意思?

#11

帖子 xyy_xx » 2009-12-09 21:29

ksun 写了:这个用法应该还是符合Parameter Expansion ${parameter:offset}的

不过对bash里面变量的认识还是不足,原来以为要显示设置的类似$name的形式才是变量

现在看来0,1。。。,9等数字应该也是bash里面的变量名了,不过访问方式是$1,$2等等而已

晕,看样子shell脚本还是要好好看看了,不然不好意思给人讲熟悉linux了 :em20

代码: 全选

command arg1 arg2 arg3..
$0      $1    $2   $3
拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧
渣浪:@CodewalkerDotMe
推特:@codewalkertse
博客:http://codewalker.me/
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: bash里面 ${0:12}是什么意思?

#12

帖子 eexpress » 2009-12-09 22:53

普及知识啊。

shell中的一些扩展字符
• !! 上个命令的所有字符
• !* 一个命令的所有参数
• !^ 上一条命令的第一个参数
• !$ 上一条命令的最后一个参数
• !:3 上一条命令的第3个参数
• !:0 命令
• !:x x指示 可以是^ $ x-y * x*(第x个起) x-(不包括$) % n 0
• !n history中的第n条命令,-n表示最后倒数的。
• !?xxx 包含xxx的最后一个命令
• !xxx xxx开头的最后一个命令
• ^string1^string2^ 快速替换。重复上一条命令,将 string1 替换为 string2. 与 ``!!:s/string1/string2/''

修饰符 (Modifiers)
可选的 word 指示器之后,可以出现一个或多个下述 modifiers 的序列,每一个都前缀有 `:'。

h 删除文件名组成的尾部,只保留头部(路径)。
t 删除文件名组成中前面的成分,保留尾部(文件)。
r 删除 .xxx 形式中尾部的后缀成分,保留基本名称部分。
e 删除所有内容,保留尾部的后缀。
p 打印新的命令,但是不执行它。
q 引用替换所得的词,使它不再进行替换。
x 引用替换所得的词,类似与 q, 但是会根据 blanks,空白 和新行符分解为词。
s/old/new/
将事件行中出现的第一个 old 替换为 new。 任何分隔符都可以用来代替
/,最后一个分隔符是可选的,如果它是事件行的最后一个字符。 old 和 new 中的分隔符可以用一个反斜杠来引用。如果 &
出现在 new 中,它将替换为 old。 可以用单个反斜杠来引用 &。如果 old 为空,它将设置为最后替换的 old,
或者,如果前面没有发生过历史替换,就是 !?string[?] 搜索中的最后一个 string。
& 重复上一次替换。
g 使得改变被整个事件行所接受。用于与 `:s' 或 `:&' 结合 (例如,`:gs/old/new/')。 如果与 `:s'
结合使用,任何分隔符都可以用来代替 /, 最后一个分隔符是可选的,如
果它是事件行的最后一个字符。

$ mv foo.{jpeg,jpg}

这个命令将把foo.jpeg改名为foo.jpg。

bash脚本的参数

$0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。
$1:第一个参数
$2,$3,$4,$5,…一次类推。

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示shell使用的当前选项。
$? 显示最后命令的推出状况。0表示没有错误。

================================================

1.得到字符串长度
☎ echo ${#variable}
☎ expr length “$variable”
☎ expr “$variable” : “.*”


e=www; a=e; echo ${!a}; eval echo \$$a

2.查找字符串子串位置
☎ expr index “$variable” “substring”

3.得到字符串子字符串
☎ echo ${variable:position:length}
☎ expr substr “$variable” startposition length

4.匹配正则表达式之匹配长度
expr match “$x” “this”
☎ expr match “$x” “string”

5.字符串的掐头去尾
☎ echo ${variable#startletter*endletter} # #表示掐头,因为键盘上#在$前面,一个表示最小匹配
☎ echo ${variable##tartletter*endletter} 两个表示最大匹配
☎ echo ${variable%startletter*endletter} # %表示去尾,因为键盘上%在$后面,一个表示最小匹配
☎ echo ${variable%%startletter*endletter} 两个表示最大匹配

6.字符(串)的替换
☎ echo ${variable/oldletter/newletter} #替换一个
☎ echo ${variable//oldletter/newletter} #替换所有

7。测试变量是否已经赋值
${variable:-value}
如果变量已经赋值,则使用该变量值。如果变量为空,则使用value。需要注意的是,value并不赋给variable。
${variable:=value}
该表达式上面的区别就是,如果variable为空,则value赋给variable。
${variable:?”customed message “}
变量是否为空,如果为空的话则显示带有系统错误信息

================================================

Bash 测试和比较函数
test expr 和 [ expr ] 是等价的。
☎ test 3 -gt 4 && echo True || echo false
false
必须用 \ 加以转义
☎ [ “abc” \< “def” ];echo $?
0
-a 和 -o 选项使用逻辑运算符 AND 和 OR
☎ [ ! \( “a” = “$HOME” -o 3 -lt 4 \) ]; echo $?
1

不需要对 (( 和 )) 之间的操作符转义
(( w=(y/x) + ( (~ ++x) & 0×0f ) )); echo $? $x $y $w

用 [[ 复合命令,进行通配符测试,包含算术测试
( -d “$HOME” ) && ( -w “$HOME” ) && echo “home is a writable directory”
“abc def d,x” == a[abc]*\ ?d* ; echo $?
| a -gt 2 ; echo $?

在 shell 中用 echo 和 $(( )) 直接进行计算
● 鸣学
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
联系:

Re: bash里面 ${0:12}是什么意思?

#13

帖子 pityonline » 2009-12-09 23:29

看了ee的普及贴,才知道shell的水真的很深……
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
onelynx
帖子: 817
注册时间: 2008-11-13 16:03

Re: bash里面 ${0:12}是什么意思?

#14

帖子 onelynx » 2009-12-10 0:00

努力学习中
头像
xyy_xx
帖子: 344
注册时间: 2008-09-17 13:37
系统: arch|centos

Re: bash里面 ${0:12}是什么意思?

#15

帖子 xyy_xx » 2009-12-10 10:09

eexpress 写了:普及知识啊。

shell中的一些扩展字符
• !! 上个命令的所有字符
• !* 一个命令的所有参数
• !^ 上一条命令的第一个参数
• !$ 上一条命令的最后一个参数
• !:3 上一条命令的第3个参数
• !:0 命令
• !:x x指示 可以是^ $ x-y * x*(第x个起) x-(不包括$) % n 0
• !n history中的第n条命令,-n表示最后倒数的。
• !?xxx 包含xxx的最后一个命令
• !xxx xxx开头的最后一个命令
• ^string1^string2^ 快速替换。重复上一条命令,将 string1 替换为 string2. 与 ``!!:s/string1/string2/''

修饰符 (Modifiers)
可选的 word 指示器之后,可以出现一个或多个下述 modifiers 的序列,每一个都前缀有 `:'。

h 删除文件名组成的尾部,只保留头部(路径)。
t 删除文件名组成中前面的成分,保留尾部(文件)。
r 删除 .xxx 形式中尾部的后缀成分,保留基本名称部分。
e 删除所有内容,保留尾部的后缀。
p 打印新的命令,但是不执行它。
q 引用替换所得的词,使它不再进行替换。
x 引用替换所得的词,类似与 q, 但是会根据 blanks,空白 和新行符分解为词。
s/old/new/
将事件行中出现的第一个 old 替换为 new。 任何分隔符都可以用来代替
/,最后一个分隔符是可选的,如果它是事件行的最后一个字符。 old 和 new 中的分隔符可以用一个反斜杠来引用。如果 &
出现在 new 中,它将替换为 old。 可以用单个反斜杠来引用 &。如果 old 为空,它将设置为最后替换的 old,
或者,如果前面没有发生过历史替换,就是 !?string[?] 搜索中的最后一个 string。
& 重复上一次替换。
g 使得改变被整个事件行所接受。用于与 `:s' 或 `:&' 结合 (例如,`:gs/old/new/')。 如果与 `:s'
结合使用,任何分隔符都可以用来代替 /, 最后一个分隔符是可选的,如
果它是事件行的最后一个字符。

$ mv foo.{jpeg,jpg}

这个命令将把foo.jpeg改名为foo.jpg。

bash脚本的参数

$0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。
$1:第一个参数
$2,$3,$4,$5,…一次类推。

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示shell使用的当前选项。
$? 显示最后命令的推出状况。0表示没有错误。

================================================

1.得到字符串长度
☎ echo ${#variable}
☎ expr length “$variable”
☎ expr “$variable” : “.*”


e=www; a=e; echo ${!a}; eval echo \$$a

2.查找字符串子串位置
☎ expr index “$variable” “substring”

3.得到字符串子字符串
☎ echo ${variable:position:length}
☎ expr substr “$variable” startposition length

4.匹配正则表达式之匹配长度
expr match “$x” “this”
☎ expr match “$x” “string”

5.字符串的掐头去尾
☎ echo ${variable#startletter*endletter} # #表示掐头,因为键盘上#在$前面,一个表示最小匹配
☎ echo ${variable##tartletter*endletter} 两个表示最大匹配
☎ echo ${variable%startletter*endletter} # %表示去尾,因为键盘上%在$后面,一个表示最小匹配
☎ echo ${variable%%startletter*endletter} 两个表示最大匹配

6.字符(串)的替换
☎ echo ${variable/oldletter/newletter} #替换一个
☎ echo ${variable//oldletter/newletter} #替换所有

7。测试变量是否已经赋值
${variable:-value}
如果变量已经赋值,则使用该变量值。如果变量为空,则使用value。需要注意的是,value并不赋给variable。
${variable:=value}
该表达式上面的区别就是,如果variable为空,则value赋给variable。
${variable:?”customed message “}
变量是否为空,如果为空的话则显示带有系统错误信息

================================================

Bash 测试和比较函数
test expr 和 [ expr ] 是等价的。
☎ test 3 -gt 4 && echo True || echo false
false
必须用 \ 加以转义
☎ [ “abc” \< “def” ];echo $?
0
-a 和 -o 选项使用逻辑运算符 AND 和 OR
☎ [ ! \( “a” = “$HOME” -o 3 -lt 4 \) ]; echo $?
1

不需要对 (( 和 )) 之间的操作符转义
(( w=(y/x) + ( (~ ++x) & 0×0f ) )); echo $? $x $y $w

用 [[ 复合命令,进行通配符测试,包含算术测试
( -d “$HOME” ) && ( -w “$HOME” ) && echo “home is a writable directory”
“abc def d,x” == a[abc]*\ ?d* ; echo $?
| a -gt 2 ; echo $?

在 shell 中用 echo 和 $(( )) 直接进行计算
不愧是神
拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧
渣浪:@CodewalkerDotMe
推特:@codewalkertse
博客:http://codewalker.me/
回复