私はアクティブなJavaのバージョンを考慮して、Java_HOMEとユーザーのPATHの両方を自動的に設定するbashスクリプトを構築していますが、何らかの理由でPATHが正しく構築されず、「:」の代わりに空白が追加されます。理由を教えて?
スクリプトの下。
ありがとう!
#!/bin/bash
export Java_HOME=$(dirname $(dirname `readlink -f /etc/alternatives/Java`))
IFS=':';
for i in $PATH;
do
Java1=$i/bin/Java
Java2=$i/Java
if [ -d "$i" ];
then
if [ ! -L "$Java1" ] && [ -x "$Java1" ] || [ ! -L "$Java2" ] && [ -x "$Java2" ];
then
echo "dropping path: $i";
else
NEW=$NEW:$i
fi
fi
done
PATH=$NEW:$Java_HOME/bin
echo
echo "Final:"
echo $PATH
出力例:
$ ./Java_home_setter.sh
dropping path: /usr/lib/jvm/Java-8-openjdk-AMD64/jre/bin
Final:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin /usr/lib/jvm/Java-8-openjdk-AMD64/bin
これは、IFS変数を変更して「:」を使用したためです。
したがって、その出力時に、変数は、「:」が入力フィールドセパレーターであると見なして、「スペース」であるデフォルトの出力フィールドセパレーターに置き換えられます。
以下のようにIFSを使用する前にbackupを取得する必要があります。
OIFS=$IFS
IFS=':';
'for'ループが終了した後の後で、それを復元します。
IFS=$OIFS
また、その前にパスがない「:」を削除します
PATH=${PATH#:*}
スクリプトは次のようになります。
#!/bin/bash
export Java_HOME=$(dirname $(dirname `readlink -f /etc/alternatives/Java`))
OIFS=$IFS
IFS=':';
for i in $PATH;
do
Java1=$i/bin/Java
Java2=$i/Java
if [ -d "$i" ];
then
if [ ! -L "$Java1" ] && [ -x "$Java1" ] || [ ! -L "$Java2" ] && [ -x "$Java2" ];
then
echo "dropping path: $i";
else
NEW=$NEW:$i
fi
fi
done
IFS=$OIFS
PATH=$NEW:$Java_HOME/bin
PATH=${PATH#:*}
echo
echo "Final:"
echo $PATH