IFS 和通过目录中的单个位置移动
IFS and moving through single positions in directory
我有两个问题。
- 我在脚本中发现了以下代码行:
IFS=${IFS#??}
我想了解它到底在做什么?
当我尝试在目录的每个地方执行某些操作时,例如:
= home/user/bin/etc/something...
所以我需要将 IFS 更改为“/”,然后像
这样在 for 循环中继续执行此操作
while [ -e "" ]; do
for F in ``
#do something
done
shift
done
这是正确的方法吗?
${var#??}
是一个 shell parameter expansion。它尝试将 $var
的开头与 #
之后写入的模式相匹配。如果是,它将 returns 变量 $var
删除该部分。由于 ?
匹配任何字符,这意味着 ${var#??}
从 var $var
.
中删除前两个字符
$ var="hello"
$ echo ${var#??}
llo
因此,对于 IFS=${IFS#??}
,您在删除前两个字符后将 IFS
重置为它的值。
要循环遍历 /
分隔字符串中的单词,您可以将拆分后的字符串存储到一个数组中,然后循环遍历它:
$ IFS="/" read -r -a myarray <<< "home/user/bin/etc/something"
$ for w in "${array[@]}"; do echo "-- $w"; done
-- home
-- user
-- bin
-- etc
-- something
我有两个问题。
- 我在脚本中发现了以下代码行:
IFS=${IFS#??}
我想了解它到底在做什么? 当我尝试在目录的每个地方执行某些操作时,例如:
= home/user/bin/etc/something...
所以我需要将 IFS 更改为“/”,然后像
这样在 for 循环中继续执行此操作while [ -e "" ]; do for F in `` #do something done shift done
这是正确的方法吗?
${var#??}
是一个 shell parameter expansion。它尝试将 $var
的开头与 #
之后写入的模式相匹配。如果是,它将 returns 变量 $var
删除该部分。由于 ?
匹配任何字符,这意味着 ${var#??}
从 var $var
.
$ var="hello"
$ echo ${var#??}
llo
因此,对于 IFS=${IFS#??}
,您在删除前两个字符后将 IFS
重置为它的值。
要循环遍历 /
分隔字符串中的单词,您可以将拆分后的字符串存储到一个数组中,然后循环遍历它:
$ IFS="/" read -r -a myarray <<< "home/user/bin/etc/something"
$ for w in "${array[@]}"; do echo "-- $w"; done
-- home
-- user
-- bin
-- etc
-- something