Bash Shell脚本-IFS读取语法错误:意外重定向

Bash Shell脚本-IFS读取语法错误:意外重定向,bash,docker,Bash,Docker,我有这个shell脚本 #/bin/bash SUB_DOMAIN="test.google.com" IFS=. read -ra __ <<< "${SUB_DOMAIN}" IFS=. eval 'DOMAIN="${__[*]:(-2)}"' echo "${DOMAIN} - ${SUB_DOMAIN}" 很可能您没有安装bash,而是在posixshell中运行脚本。此处的字符串很可能

我有这个shell脚本

#/bin/bash
SUB_DOMAIN="test.google.com"
IFS=. read -ra __ <<< "${SUB_DOMAIN}"
IFS=. eval 'DOMAIN="${__[*]:(-2)}"'
echo "${DOMAIN} - ${SUB_DOMAIN}"

很可能您没有安装bash,而是在posixshell中运行脚本。此处的字符串
很可能您没有安装bash,并且您正在posix shell中运行脚本。这里的字符串
使用POSIX shell语法进行操作,它在任何地方都应该很好:

#/副秘书长/垃圾箱/环境卫生
SUB_DOMAIN=“test.google.com”
DOMAIN=“${SUB_DOMAIN#*.}”
回显“${DOMAIN}-${SUB_DOMAIN}”

使用POSIX shell语法进行操作,它应该在任何地方都很好:

#/副秘书长/垃圾箱/环境卫生
SUB_DOMAIN=“test.google.com”
DOMAIN=“${SUB_DOMAIN#*.}”
回显“${DOMAIN}-${SUB_DOMAIN}”
您在评论中说:


我的目标实际上是在点处分离一个字符串,并得到最后两个值

sedsed(1)工具可以直接执行此操作。如果将输入字符串视为

   text     period  non-periods  period  non-periods  end
foo.bar.baz    .      google        .        com
您可以将其转换为正则表达式语法:
是任何单个文本字符,
\.
是一个句点,
[^.]
不是句点,
x*
是任意数量的
x
,而
$
是字符串的结尾。括号
\(…\)
(在“classic”regexps中)标记您稍后要检索的组。因此,您可以构造与此字符串匹配的regexp,将域部分标记为捕获组:

   text     period  non-periods  period  non-periods  end
    .*         \. \(  [^.]*        \.       [^.]*   \) $
然后可以使用
sed
将匹配此regexp的字符串替换为匹配组的内容
\1

#/垃圾箱/垃圾箱
SUB_DOMAIN=“test.google.com”
DOMAIN=$(回显“$SUB\u DOMAIN”| sed的/*\.\([^.]*\.[^.]*\)$/\1/)
回显“$DOMAIN-$SUB_DOMAIN”
只要POSIX工具集可用,包括像Alpine容器这样的最小环境,这就可以工作。它不依赖于任何特定的shell扩展。

您在评论中说:


我的目标实际上是在点处分离一个字符串,并得到最后两个值

sedsed(1)工具可以直接执行此操作。如果将输入字符串视为

   text     period  non-periods  period  non-periods  end
foo.bar.baz    .      google        .        com
您可以将其转换为正则表达式语法:
是任何单个文本字符,
\.
是一个句点,
[^.]
不是句点,
x*
是任意数量的
x
,而
$
是字符串的结尾。括号
\(…\)
(在“classic”regexps中)标记您稍后要检索的组。因此,您可以构造与此字符串匹配的regexp,将域部分标记为捕获组:

   text     period  non-periods  period  non-periods  end
    .*         \. \(  [^.]*        \.       [^.]*   \) $
然后可以使用
sed
将匹配此regexp的字符串替换为匹配组的内容
\1

#/垃圾箱/垃圾箱
SUB_DOMAIN=“test.google.com”
DOMAIN=$(回显“$SUB\u DOMAIN”| sed的/*\.\([^.]*\.[^.]*\)$/\1/)
回显“$DOMAIN-$SUB_DOMAIN”

只要POSIX工具集可用,包括像Alpine容器这样的最小环境,这就可以工作。它不依赖于任何特定的shell扩展。

这有什么意义?如果你以后
[*]
读它,你为什么要
读它呢<代码>最小Docker Linux(alpha)
据我所知,没有“Docker Linux(alpha)”。你能链接一下“Docker Linux(alpha)”是什么吗?你是说你在docker虚拟化中运行它吗?如果是这样,您运行的是哪个基本映像(我不知道linux发行版叫“alpha”)?如果有可用的bash版本,该版本是什么?你的docker文件是什么,或者你是如何在docker内部运行它的?谢谢。我用traefik试过,但我也用docker hub的其他软件试过。它与Alpine Linux一起提供。目前版本是3.11.6,您很可能在posix shell中运行脚本,默认情况下在linux中是可用的。
我的目标实际上是在各个点上分离一个字符串并获得最后两个值。它在WSL debian中对我很有效。该
eval
的目的是什么?如果你以后
[*]
读它,你为什么要
读它呢<代码>最小Docker Linux(alpha)
据我所知,没有“Docker Linux(alpha)”。你能链接一下“Docker Linux(alpha)”是什么吗?你是说你在docker虚拟化中运行它吗?如果是这样,您运行的是哪个基本映像(我不知道linux发行版叫“alpha”)?如果有可用的bash版本,该版本是什么?你的docker文件是什么,或者你是如何在docker内部运行它的?谢谢。我用traefik试过,但我也用docker hub的其他软件试过。它与Alpine Linux一起提供。目前版本是3.11.6,您很可能在posix shell中运行脚本,默认情况下在linux中是可用的。
我的目标实际上是在点处分离一个字符串并获得最后两个值。这在WSL debian中对我很有效。四个子shell命令完成POSIX内置变量扩展的工作
“${sub_DOMAIN#*.}”
,也许它有点太多了^^4个子shell命令来完成POSIX内置变量扩展的工作
“${sub_DOMAIN#*.}”
,也许它有点太多了^^