使用bash从Txt文件设置用户名和密码

使用bash从Txt文件设置用户名和密码,bash,shell,Bash,Shell,我有一个env.txt文件,格式如下: lDRIVER={ODBC Driver 13 for SQL Server}; PORT=1433; SERVER=serveename; DATABASE=db; UID=username; PWD=password! 我有一个git bash脚本(.sh),它需要该文件中的UID和PWD。我在考虑最后一行/第二行的号码。如何做到这一点/有没有更好的方法(比如查找UID和PWD并以这种方式分配gitbash变量)有很多方法可以做到这一点。您可以使用a

我有一个env.txt文件,格式如下:

lDRIVER={ODBC Driver 13 for SQL Server};
PORT=1433;
SERVER=serveename;
DATABASE=db;
UID=username;
PWD=password!

我有一个git bash脚本(.sh),它需要该文件中的UID和PWD。我在考虑最后一行/第二行的号码。如何做到这一点/有没有更好的方法(比如查找UID和PWD并以这种方式分配gitbash变量)

有很多方法可以做到这一点。您可以使用
awk
,我个人会使用它,因为对于这种类型的东西,它有点像一把x-acto刀:

uid=$(awk -F"[=;]" '/UID/{print $2}' env.txt)
pwd=$(awk -F"[=;]" '/PWD/{print $2}' env.txt)
或者
grep
sed
sed
很好,因为它可以让您非常具体地了解要从行中剪切的信息,但它是具有学习曲线的正则表达式:

uid=$(grep "UID" env.txt | sed -r 's/^.*=(.*)(;|$)/\1/g' )
pwd=$(grep "PWD" env.txt | sed -r 's/^.*=(.*)(;|$)/\1/g' )
正如@JamesK在评论中指出的,您可以使用
sed
并让它进行搜索,而不是
grep
。这真是太好了,我肯定会选择它而不是
grep | sed

uid=$(sed -nr '/UID/s/^.*=(.*)(;|$)/\1/gp' )
pwd=$(sed -nr '/PWD/s/^.*=(.*)(;|$)/\1/gp' )
或者
grep
cut
。呜呜。。。我们都可以做得更好,但有时我们只是想
grep
cut
而不必去想:

uid=$(grep "UID" env.txt | cut -d"=" -f2 | cut -d";" -f1)
pwd=$(grep "PWD" env.txt | cut -d"=" -f2 | cut -d";" -f1)

不过,我绝对不会用行号。这看起来与odbc.ini文件以及每个odbc条目中参数的列出顺序无关。

有很多方法可以做到这一点。您可以使用
awk
,我个人会使用它,因为对于这种类型的东西,它有点像一把x-acto刀:

uid=$(awk -F"[=;]" '/UID/{print $2}' env.txt)
pwd=$(awk -F"[=;]" '/PWD/{print $2}' env.txt)
或者
grep
sed
sed
很好,因为它可以让您非常具体地了解要从行中剪切的信息,但它是具有学习曲线的正则表达式:

uid=$(grep "UID" env.txt | sed -r 's/^.*=(.*)(;|$)/\1/g' )
pwd=$(grep "PWD" env.txt | sed -r 's/^.*=(.*)(;|$)/\1/g' )
正如@JamesK在评论中指出的,您可以使用
sed
并让它进行搜索,而不是
grep
。这真是太好了,我肯定会选择它而不是
grep | sed

uid=$(sed -nr '/UID/s/^.*=(.*)(;|$)/\1/gp' )
pwd=$(sed -nr '/PWD/s/^.*=(.*)(;|$)/\1/gp' )
或者
grep
cut
。呜呜。。。我们都可以做得更好,但有时我们只是想
grep
cut
而不必去想:

uid=$(grep "UID" env.txt | cut -d"=" -f2 | cut -d";" -f1)
pwd=$(grep "PWD" env.txt | cut -d"=" -f2 | cut -d";" -f1)

不过,我绝对不会用行号。看起来像和odbc.ini文件以及每个odbc条目中参数的列出顺序是不相关的。

首先将
PWD
重命名为类似
PASSWORD
PWD
是shell使用的一个特殊变量。更好的方法是对所有您自己的变量使用小写变量名

当密码没有特殊字符(空格,$,)时,您可以

source env.txt

当密码有特殊之处时,考虑编辑<代码> Env.txt<代码>:

lDRIVER="{ODBC Driver 13 for SQL Server}"
PORT="1433"
SERVER="serveename"
DATABASE="db"
UID="username"
PASSWORD="password!"

当您只对小写的UID和PASWD感兴趣时,考虑只选择感兴趣的字段,并将关键字更改为小写

source <(sed -rn '/^(UID|PWD)=/ s/([^=]*)/\L\1/p' env.txt)

source首先将
PWD
重命名为类似于
PASSWORD
PWD
是shell使用的一个特殊变量。更好的方法是对所有您自己的变量使用小写变量名

当密码没有特殊字符(空格,$,)时,您可以

source env.txt

当密码有特殊之处时,考虑编辑<代码> Env.txt<代码>:

lDRIVER="{ODBC Driver 13 for SQL Server}"
PORT="1433"
SERVER="serveename"
DATABASE="db"
UID="username"
PASSWORD="password!"

当您只对小写的UID和PASWD感兴趣时,考虑只选择感兴趣的字段,并将关键字更改为小写

source <(sed -rn '/^(UID|PWD)=/ s/([^=]*)/\L\1/p' env.txt)

source注意,您可以将
grep
滚动到
sed
调用中:
uid=$(sed-nr'/uid/s/^.*=(*)(;|$)/\1/gp')
。操作方法是添加
-n
标志,默认不打印行;只对与UID匹配的行(
/UID/
)进行操作,并且在结束时使用
p
打印该行。@JamesK这很好。我大部分时间都在摸索
sed
。但我肯定会记住这一点。我接受了这个答案。请注意,您可以将
grep
滚动到
sed
调用中:
uid=$(sed-nr'/uid/s/^.*=(*)(;|$)/\1/gp')
。操作方法是添加
-n
标志,默认不打印行;只对与UID匹配的行(
/UID/
)进行操作,并且在结束时使用
p
打印该行。@JamesK这很好。我大部分时间都在摸索
sed
。但我肯定会记住这一点。我接受了这个答案。你介意评论一下每种方法的积极和消极方面吗?是的,我认为UID和PWD是特殊的变量,这就是让我搞砸的原因。不过,我将此文件用于pyodbc,我想知道是否必须调用它们,我会犹豫是否
source
此文件。它读起来像一个
odbc.ini
,这意味着可能有一个
[odbc NAME]
块隐藏在其中。此外,正如您所注意到的,这些参数都是大写的,这可能会导致已经存在的环境变量出现问题。。。更改变量名称时,我收到错误:('IM002'、'[IM002][Microsoft][ODBC驱动程序管理器]未找到数据源名称,并且未指定默认驱动程序(0)(SqlDriverConnection))。我编辑了我的答案,因此您将仅获取所需字段的源,并以小写形式更改关键字。是的。。。问题是密码变量仍然必须被称为PWD(对于pyodbc),因此更改变量名不是一个选项。如果你能把源代码的输出赋给另一个变量名,那么它就可以工作了。是的,我认为UID和PWD是特殊的变量,这就是把我搞砸的原因。不过,我将此文件用于pyodbc,我想知道是否必须调用它们,我会犹豫是否
source
此文件。它读起来像一个
odbc.ini
,这意味着可能有一个
[odbc NAME]
块隐藏在其中。此外,正如您所注意到的,这些参数都是大写的,这可能会导致已经存在的环境变量出现问题。。。我得到错误:('IM002','[