shell脚本中,解决:路径含中文和空格问题 (***)已验证 OK

shell脚本中处理 路径中的中文和空格方法 (***)已验证 OK

字段分隔符 IFS - Linux Shell 脚本 (*)

Linux下shell支持中文显示的方法

在Shell里输入中文 - linux教程

解决Xshell不显示中文目录

让linux(centos)支持中文文件和文件夹

=====================================

shell脚本中,解决:路径含中文和空格问题 (***)已验证 OK

原标题:shell脚本中处理 路径中的中文和空格方法

  https://www.cnblogs.com/zhangdewang/p/8866668.html

OLDIFS=$IFS
IFS=$'\n'
#存放路径的变量在引用时都使用双引号括起来 "$VAR_PATH"  @注 1
#路径拼接时后续的就不需要加双引号了"$VAR_PATH"/bin  @注 2

  #
#如果用另一个变量存放路径变量值,再次使用时还是要用双引号  @注 3
PATH_2="$VAR_PATH"/bin    @注 3_1
#use the PATH_2
echo
"$PATH_2"   @注 3_2
 
IFS=$OLDIFS   @注 4

路径示例:

/home/新建 文件夹/test.sh  # 在“新建”和“文件夹”之间,有一个空格。

注 1:VAR_PATH ="/home/新建 文件夹"。<< 变量的定义与赋值。

      "/home/新建 文件夹/"  <<最末带有“/”路径符号,在 debian 12 上验证,也是 OK的 ?。

注 2:"$VAR_PATH"/bin:“/bin” 为后续的拼接部分,不需要双引号了。如果后续路径含有空格,还是需要双引号的吧?

注 3:例子参考 注 3_1,注 3_2。

用另一个变量、存放路径变量值:注 3_1

再次使用时,还是要用双引号:注 3_2

注 4:使用没有空格的中文路径,在 debian 12 上验证,是 OK的(如使用 en版本安装,则 OS 还需要添加中文环境显示支持,这是需要的)。因此,主要是需要处理路径中的“空格”问题。

当路径中带有空格时,路径会被空格截断,从而形成 2段、或多段的字符串;而不是解释为一串完整的路径字符串。

因此,需要首先 IFS=$'\n',然后,在 sh 运行结束之后,还需要复原 IFS=$OLDIFS。否则,在系统默认状态下的路径使用方法,某些路径的构造,可能就会变异常了。

在 linux下,许多的(大部分,甚至是绝大部分)软件工具,都是在采用“拉丁字符集”操作系统环境下开发的,使用中文路径,会造成这类软件的系统路径异常。

拉丁“空格”与中文“空格”的字符编码,是不一样的。

在跨平台编程时,麻烦就是“空格”用肉眼是看不出区别的,由此导致了路径的“空格”问题,有时需要凭经验来判断。

参考:

1.16 字段分隔符和迭代器

  https://zhuanlan.zhihu.com/p/612420220

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念。在处理文本数据时,它的用途可不小。我们将会讨论把单个数据流划分成不同数据元素的定界符(delimiter)。

内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量。它是当前shell环境使用的默认定界字符串。

# 考虑CSV数据的情况:
data="name,sex,rollno,location"
# 我们可以使用IFS读取变量中的每一个条目。
oldIFS=$IFS
IFS=,
for item in $data;
do
echo Item: $item
done
IFS=$oldIFS

  .
输出如下:
Item: name
Item: sex
Item: rollno
Item: location

IFS的默认值为空白字符(换行符、制表符或者空格)。
当IFS被设置为逗号时,shell将逗号视为一个定界符,因此变量 $item 在每次迭代中读取由逗号分隔的子串作为变量值。

字段分隔符 IFS - Linux Shell 脚本 (*)

  https://www.codeleading.com/article/43491108625/

内部字段分隔符(Internal Field Separator, IFS)定义一个定界符,默认是空格

下面是一个示例:

    #!/bin/bash
    oldIFS=$IFS;
    IFS=":";
     
    count=0;
    for item in $PATH;
    do
        count=$(( count + 1 ))
        printf "%s\t%s\n" $count $item;
    done
     
    IFS=$oldIFS;

  • oldIFS=$IFS; #保存之前的设置
  • IFS=$oldIFS; #恢复之前的设置。在人为修改之后,当然需要恢复原本的设置,否则,混乱了。

程序运行结果如下:

    wm@WangubuntuConsole:~/shellScriptBlog$ chmod a+x ifs.sh; ./ifs.sh
    1       /home/wm/.vscode-server-insiders/bin/84236851a9116f468345f6e8a737015d/bin
    2       /home/wm/bin
    3       /home/wm/.local/bin
    4       /home/wm/.vscode-server-insiders/bin/84236851a9116f468345f6e8a737015d/bin
    5       /usr/local/sbin
    6       /usr/local/bin
    7       /usr/sbin
    8       /usr/bin
    9       /sbin
    10      /bin
    11      /usr/games
    12      /usr/local/games
    13      /snap/bin
    wm@WangubuntuConsole:~/shellScriptBlog$

当IFS被设置为:时,shell将:看作分隔符,因此$item在每次迭代中读取由冒号分隔的子串作为变量值。

Linux下shell支持中文显示的方法

  https://hn.landui.com/help/show-6298.html

对当前环境临时生效:export.GB18030

永久写入配?文件:vi /etc/sysconfig/i18n

    #LANG="en_US.UTF-8"

    LANG="zh_CN.GB18030"

    SYSFONT="latarcyrheb-sun16"

在Shell里输入中文 - linux教程

  https://www.zixuephp.com/linux/2014117182.html

用户要想确定在所使用的Linux系统上有没有加上中文环境,具体可分为以下两步来进行,首先对于bash,需要在/etc/profile或$HOME/.profile文件里加上下面的语句:

stty cs8 -istrip stty pass8
执行下面的命令:

#export LANG =C #export LC_CTYPE=iso-8859-1
然后,在$HOME/.inputrc里加上以下语句:

set convert -meta off set output -meta on

修改之后,用户不必重新启动系统,只需新开一个虚拟终端,或者注销后再登录即可生效.

解决Xshell不显示中文目录

  https://blog.csdn.net/weixin_39578599/article/details/130693050

让linux(centos)支持中文文件和文件夹

  https://www.cnblogs.com/nianxl/p/5289135.html

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值