或者更一般地说,如何从Bash环境变量中以冒号分隔的列表中删除项?
我想我多年前已经看到了一种简单的方法,使用更高级的Bash变量扩展形式,但如果是这样的话,我已经忘记了它.对谷歌的快速搜索出乎意料地少了几个相关结果,没有一个我称之为"简单"或"优雅".例如,分别使用sed和awk的两种方法:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Run Code Online (Sandbox Code Playgroud)
什么都不直接存在?有什么类似于Bash中的split()函数吗?
更新:
看起来我需要为我的故意模糊的问题道歉; 我对解决特定用例的兴趣不如激发良好的讨论.幸运的是,我明白了!
这里有一些非常聪明的技巧.最后,我在工具箱中添加了以下三个功能.魔法发生在path_remove中,这主要基于Martin York巧妙使用awk的RS变量.
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Run Code Online (Sandbox Code Playgroud)
唯一真正的缺点是使用sed去除尾部结肠.考虑到马丁的其他解决方案是多么简单,但我非常愿意接受它!
相关问题: 如何在shell脚本中操作$ PATH元素?
通常在cshrc文件中有类似的东西来设置路径:
set path = ( . $otherpath $path )
Run Code Online (Sandbox Code Playgroud)
但是,当您多次获取cshrc文件时,路径会重复,您如何防止重复?
编辑:这是一种不干净的方式:
set localpaths = ( . $otherpaths )
echo ${path} | egrep -i "$localpaths" >& /dev/null
if ($status != 0) then
set path = ( . $otherpaths $path )
endif
Run Code Online (Sandbox Code Playgroud) 我在 /etc/bashrc(在 Fedora 上)中添加了如下条目。
#=========== Maven Related variables
export JAVA_HOME='/usr/java/default'
export PATH=${JAVA_HOME}:$PATH
#=========== Maven Related variables
export M2_HOME=/usr/local/apache-maven/apache-maven-3.0.4
export PATH=${M2_HOME}/bin:$PATH
#=========== Ant Related variables
export ANT_HOME=/usr/local/apache-ant
export Path=${ANT_HOME}/bin:$PATH
Run Code Online (Sandbox Code Playgroud)
现在,每次我执行 bash 命令刷新环境变量时,所有这些添加都会重复,并且 PATH 只是不断递归地添加自身;如果我继续执行 bash 几十次,那么 $PATH 就会变成一百行重复内容。我究竟做错了什么?
请注意,我已将这些条目添加到 /etc/bashrc 中,因为无论我以什么用户身份登录,我都希望在 PATH 中包含这些值。
谢谢,香农
我得到echo $PATH这个:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)
我想要的是以以下格式获取这些:
/usr/local/sbin
/usr/local/bin
...
Run Code Online (Sandbox Code Playgroud)
我尝试做的事情:
i=1;
for dir in `echo $PATH|cut -d ':' -f $i`
do
echo $dir
i=`expr $i + 1`
done
Run Code Online (Sandbox Code Playgroud)
但这不起作用。有人可以帮我解答吗?