建设工程检测报告查询网站,苏州网站建站推广,甘肃网站建设企业推荐,青岛高端网站建设公司IFS是shell的内置变量#xff0c;IFS是一个字符串#xff0c;里面的每一个字符都会用来作为分隔符进行单词分割。
IFS变量只在当前shell起作用。 一、对$*的影响
先做参数替换把$*替换成参数列表。相当于args[]
然后下面分两种情况#xff1a;
#xff08;1#xff09…IFS是shell的内置变量IFS是一个字符串里面的每一个字符都会用来作为分隔符进行单词分割。
IFS变量只在当前shell起作用。 一、对$*的影响
先做参数替换把$*替换成参数列表。相当于args[]
然后下面分两种情况
1当$*不在双引号里面时要做单词分割把args的每个元素继续按IFS分割成多个单词比如$1可能分成两个单词$2可能分成三个单词
2当$*在双引号里面时跳过单词分割直接把args每个元素以IFS每一个字符连接成单个单词即$1c$2c$3。c是IFS每一个字符 举例
#!/bin/bash
old_ifs$IFS
IFS:
set a:b-c d:e f
echo 参数个数$#
echo $*
loopcount0
for i in $*; do echo $i ((loopcount))
done
echo 循环次数$loopcount echo $*
loopcount0
for i in $*; do echo $i echo $i ((loopcount))
done
echo 循环次数$loopcount
IFS$old_ifs 运行结果
参数个数2 a b-c d e f a b-c d e f 循环次数4 a:b-c:d:e f a b-c d e f a:b-c:d:e f 循环次数1 二、对$的影响
先做参数替换把$替换成参数列表。相当于args[]
然后下面分两种情况
1当$不在双引号里面时要做单词分割把args的每个元素继续按IFS分割成多个单词比如$1可能分成两个单词$2可能分成3个单词
2当$在双引号里面时跳过单词分割把每个元素单独作为单词最后是多个单词即$1 $2 ... 举例
#!/bin/bash
old_ifs$IFS
IFS:
set a:b-c d:e f
echo 参数个数$#
echo $
loopcount0
for i in $; do echo $i ((loopcount))
done
echo 循环次数$loopcount echo $
loopcount0
for i in $; do echo $i echo $i ((loopcount))
done
echo 循环次数$loopcount
IFS$old_ifs 运行结果
参数个数2 a b-c d e f a b-c d e f 循环次数4 a:b-c d:e f a b-c a:b-c d e f d:e f 循环次数2 三、对变量替换结果的影响
先做变量替换然后再分下面两种情况
1当不在双引号里面时要做单词分割把替换后字符串按IFS分割成多个单词。
2当在双引号里面时跳过单词分割保持原样是单个单词。 举例
#!/bin/bash
old_ifs$IFS
IFS:;
var; a:b;:c:
echo 不带引号变量$var
echo -n 不带引号变量逐字符
echo -n $var |od -a
echo 带引号变量$var
echo -n 带引号变量逐字符
echo -n $var |od -a
echo ----------
loopcount0
for i in $var; do echo $i ((loopcount))
done
echo 循环次数$loopcount
echo ----------
loopcount0
for i in $var; do echo -n $i |od -a ((loopcount))
done
echo 循环次数$loopcount echo ----------
loopcount0
for i in $var; do echo $i echo $i ((loopcount))
done
echo 循环次数$loopcount
echo ----------
loopcount0
for i in a b c; do echo -n $i |od -a ((loopcount))
done
echo 循环次数$loopcount
IFS$old_ifs 运行结果
不带引号变量 a b c 不带引号变量逐字符0000000 sp sp a sp b sp sp c 0000010 带引号变量; a:b;:c: 带引号变量逐字符0000000 ; sp a : b ; : c : 0000011 ---------- a b c 循环次数5 ---------- 0000000 0000000 sp a 0000002 0000000 b 0000001 0000000 0000000 c 0000001 循环次数5 ---------- a b c ; a:b;:c: 循环次数1 ---------- 0000000 0000000 sp a 0000002 0000000 b 0000001 0000000 0000000 c 0000001 循环次数5
可以看到for i in $var与for i in a b c是一模一样的。 总结一下 双引号中 不在双引号中 $* 替换后不做分割把各个参数用IFS连起来。 最终是一个单词 $1c$2c$3... c 是IFS首个字符 替换后做分割对每个参数继续以IFS进行分割 最终是多个单词 word1 word2 word3 word4 word5... word1 word2可能来自参数$1 word3 word4来自参数$2 word5来自参数$3 $ 替换后不做分割各个参数单独做单词。 最终是多个单词 $1 $2 $3... 替换后做分割对每个参数继续以IFS进行分割 最终是多个单词 word1 word2 word3 word4 word5... word1 word2可能来自参数$1 word3 word4来自参数$2 word5来自参数$3 变量 var1-2-3 IFS- 替换后不做分割保持原样。 最终是一个单词 1-2-3 替换后做分割以IFS进行分割 最终是多个单词 1 2 3 四、一些应用
一批量重命名文件名含有空格的文件
重命名前
txt 2014.02.14.log
txt 2014.02.15.log 重命名后
txt_2014_02_14.log
txt_2014_02_15.log 脚本内容
oldifs$IFS
IFS$\n
for file in ls;do mv $file sed -r s/[ .]/_/g;s/(.*)_/\1./ $file
done
IFS$oldifs