[问题] 在bash里面呼叫外部程式(已解:回馈script)

楼主: JackBaska (Baska)   2016-01-27 17:38:08
=======问题已解 回馈code给大家以后用=========
感谢各位大大细心的分享跟教导,这只小script分享给
之后跟我一样有大量xlsx转csv的人,使用方法只要
sh script.sh "存取资料夹"
便会把你该资料夹所有xlsx转成csv档
但记得要装 python的xlsx2csv
参考: sudo pip install xlsx2csv
========ˇscript============
#!/bin/bash
# this script have dependence package of Python "xlsx2csv"
sudo PATH =
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~/bin
sudo export PATH
sudo echo "Start translate !"
mkdir $1
for f in `ls -1 *.xlsx`
do
xlsx2csv $f $1/${f%.*}.csv;
echo ${f%.*}
done
echo "Translation done"
~
==============================================
由于对linux 的bash一些比较特殊的写法还不是那么熟练
想跟各位linux先进请教一个写bash时的问题
想做的事情是:
用bash的方式进行xlsx转档,这里我呼叫了一个python
工具 xlsx2csv , 这个用法在 terminal时已经确定可以
使用 , 而且转换效果很好
遇到的问题:
1. 一直出现中文档名乱码问题 , 原始档案是big5没错
2. 不确定这么写能不能像teminal一样直接叫到python
的xlsx2csv
错误范例:
========================================================================
#!/bin/bash
PATH = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
sudo echo "Start translate !"
sudo xlsx2csv 2011某中文档名.xlsx Test_covert/2011某中文档名.csv
echo "Translation done"
=======================================================================
这只是我在做初步测试用bash 仿制我在terminal做的行为,且在terminal已经确定
会有我要的结果 , 但bash上面我一直没有确切的方向,查也都只查到bash的一般语法
会需要这么做主要是会批量转档的需求,所以后续还要串loop还有让档名重新产生
用过一般的批量转档程式但出来的结果是资料 "看起来" 没有任何问题,但一旦经过
任何程式呼叫后 , 会有大量的资料在呼叫过程中无故遗失,而用command line呼叫手转
的资料则没有这问题
虽然可以另外写python code直接做这件事情,但目前我试过最快且最稳的是command line
这个方法,加上很想知道如果我在 bash 里面要呼叫非一般shell的程式还有做字串重组
跟commnad重新产生 (有点像eval 但我还不确定bash叫什么) , 对小弟来说算是一个有趣
的应用,想问各位先进是否有做过这件事情 ???
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 18:04:00
for f in `ls -1 *.xlsx`do xlsx2cxv $f Test_convert/${f%.*}.csv问的是这种吗 ?啊 少了 done关于字串改写可以参考 bash manpage 的 Parameter Expansion
作者: tjjh89017 (伊达政宗)   2016-01-27 18:18:00
真不愧是CP64大师<(_ _)>
楼主: JackBaska (Baska)   2016-01-27 20:55:00
感谢CP64大大,我可以叫到我要的档案了,不过shell问题我还没搞定,会一直显示找不到 xlsx2csv的方法,我还在研究怎么得到一般操作的完整shell PATH 资讯
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:13:00
你下个 sudo env 看输出应该就会知道发生啥事了你的 sudo 吃不到你下的 PATH不过有点好奇有需要用 sudo 吗? 何不产在 /tmp 再搬过去
楼主: JackBaska (Baska)   2016-01-27 21:20:00
小弟算新手,最近越来越受不了windows的command怒切了点空间装linux,大概用一个礼拜已经爱上了 XD最近还在拜读鸟哥的文章,但其实很多观念还在建立常常用sudo是因为有时候对一些指令还不熟悉,偏偏需要权限, 不过我现在还有点茫 因为两个 PATH是一样的
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:26:00
感觉转换程式应该是不至于用到 sudo 的啊 不对 我看错了一点东西
楼主: JackBaska (Baska)   2016-01-27 21:27:00
path问题解掉了,现在在解令一个执行喷错 XD另现在执行成功了,但原本的档名encoding问题又回来了成功呼叫到xlsx2csv,但是档名encoding问题跑出来了
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:33:00
现在是转完的档名会乱码吗? 还是档名乱码导致读不到档?
楼主: JackBaska (Baska)   2016-01-27 21:34:00
档名乱码导致xlsx2csv在读档阶段喷错,我现在在查要怎么在bash里面做一部分字串的转码
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-01-27 21:36:00
建议用 iconv啊 应该是说用 convmv先把档名转一转
楼主: JackBaska (Baska)   2016-01-27 21:46:00
下午我在试时 iconv 我撞到xlsx不知道要怎么处理 QQconvmv 是还没弄懂下法 现在在试 QQ
作者: kenduest (小州)   2016-01-28 00:03:00
有几个问题确认一下:1. 一开始问题,你 script 的变量语法宣告有问题PATH=path1:path2:path3 这样子,= 符号两边不可以空白2. 你改了 PATH 变量,不一定会让 sudo 执行时候套用不小心按到“嘘”的选项 -.-"3. sudo 的 PATH 很多解法,一般最简单可以改目的帐号的 shell 设定档案设定,后续使用 sudo -i 方式来执行吃目的身份的 shell 初始化环境设定配置就可以了4. 你的当下语系是 zh_tw.Big5 还是 zh_TW.UTF8 呢执行 locale 看一下 LANG 与 LC_ALL 变量确认一下目前这个年代应该不大会默认使用 zh_TW.Big5 这类编码不过还是可以确认一下比较好确认问题点至于楼上其他朋友提到 convmv 主要是解决档名的编码与所处使用的语系编码不同的档案名称修改工具一般大多用于 file server 可能以往是使用 Big5 的编码后续系统默认 locale 改成 utf8 这类,系统的程式要能够正常识别显示,尤其像是 samba 这类就显得重要
楼主: JackBaska (Baska)   2016-01-28 00:29:00
感谢两位大大的讲解,我设定是全utf8,convmv我有看过讨论改档名的事情,只是我需要的是批量改档名,所以我还在摸索,由于取得资料的资料源全都是万恶MS的big5,最小单位的资料大概都会到30档案,每个档案约有数万比资料所以小弟linux新手得越级打怪 QQrz 我是先手动转档处理很迫切要的前二十多份,但类似的问题我觉得还会遇到所以有点越级打怪还是来跟大家请教了 QQ虽然可以load到python里面然后再做转档,但我目前试速度最快效果最好的方式是直接让shell叫,用shell default的语系跳过python我要处理open read & write的问题直接转
作者: kenduest (小州)   2016-01-28 00:43:00
不过还是没看出来你转档失败的主要问题点在哪目前你 script 改好程式码内容怎样,执行跑有错误吗那错误讯息要给一下要不然还是有点困惑看不出来是 shell script 还是 python script 的问题
楼主: JackBaska (Baska)   2016-01-28 00:46:00
它输出 xlsx2csv 出现执行错误,而执行喷错内容就是常见的big5码,并表示这些字符在里面是不允许的,所以我觉得是档名编码问题,过去传资料进方法或函数跳此类错误都是把encoding处理好就解掉了
作者: kenduest (小州)   2016-01-28 00:55:00
所以你系统还是使用 big5 的 locale 环境?
楼主: JackBaska (Baska)   2016-01-28 01:35:00
UTF8是资料源的机构是全面big5+excel,两个让我头大的东西,big5 要转码 excel会把读档时间拉长所以我是在系统内直接做转档,因为我default是utf8所以xlsx2csv会自动帮我转成utf8第一句话没打好 我是utf8 取资料单位是全面big5
作者: Hevak (Arthow Eshes)   2016-01-28 07:30:00
“which xlsx2csv”看看那东西到底有没有在你新写的PATH里?也可以先在script内“source ~/.bashrc”看看能不能正常跟terminal一样动,这个指令就是加载你的.bashrc那些变量放在行头可能有效,不肯定@@档头第1行
楼主: JackBaska (Baska)   2016-01-28 08:13:00
感谢H大,不过PATH的问题已经解了,现在在解中文档名编码
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-02-02 00:32:00
呃 后来查了一下 设定 PATH 的地方不用 sudo也不能用 sudo 因为那是 bash 的内建功能 sudo 不吃之前那边误导到了不好意思 @@就只要 PATH=$PATH:~/bin; export PATH; 就可以了如果说要确定 sudo 有吃到你前面下的变量用 sudo -E

Links booklink

Contact Us: admin [ a t ] ucptt.com