如何在 Bash 脚本中考虑白色 Space 和双引号中的追加字符串
How to Account for White Space and Append Strings in Double Quotes in Bash Script
您好,我有一项任务需要将项目从一个集群转移到另一个集群。
我能做到的唯一方法是重新创建项目。我有一个脚本可以工作并在 运行 OpenStack 集群中收集列出的项目,但我需要能够取出我存储的文件并使用它来重新创建项目。
这是收集可用项目的脚本:
#!/bin/bash
# ======================================================
# Author: Richard Barrett
# Date Created: 08/05/2021
# Organization: ITAdminInfra
# Purpose: Initialize OpenStack Project Gather Script
# ======================================================
start=`date +%s`
#set -e
# keep track of the last executed command
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
# echo an error message before exiting
#trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT
# EXIT Codes
# ==========
EXIT=1
EXIT_2=2
EXIT_126=126
AUTH=$(source ~/admin-openrc.sh)
OUTPUTDIR="/tmp/openstack_migrations"
OUTPUTFILE="$OUTPUTDIR/projects_listed_names_as_values.txt"
eval $AUTH
echo "======================================================="
echo " GATHERING PROJECT INFORMATION "
echo "======================================================="
# Make Directories in $OUTPUTDIR
if [ -d "$OUTPUTDIR" ]; then
# Take action if $OUTPUTDIR exists
echo "The Directory $OUTPUTDIR exists..."
echo "Check for Pre-Existing OpenStack Migration Info..."
else
echo "Directory $OUTPUTDIR does not exist..."
echo "Making $OUTPUTDIR for OpenStack Info..."
mkdir -p $OUTPUTDIR
fi
echo "Sourced Keystone via $AUTH succesful..."
echo "======================================================="
echo " OPENSTACK PROJECTS COLLECTED "
echo "======================================================="
openstack project list -c Name -f value
openstack project list -c Name -f value > $OUTPUTFILE
echo "======================================================="
printf "\n"
echo "Information on projects gathered has been stored in $OUTPUTFILE"
$OUTPUTFILE
包含如下内容:
[ OpenStack]$ cat /tmp/openstack_migrations/projects_listed_names_as_values.txt
testing_grounds
Michaud
Ansible Automation
Sustaining Development
Data Center Services
MF-DevStack
Kubernetes Labs
mso-ems
Network Development
Data Engineering
Data Center Operations Service Scanning
admin
service
OpenStack-Example
Petes-place
test
Image Factory
Network Automation
Fault and Performance Management
Microseg
Development
Docker Enterprise
Application Architecture
casa-de-pedro
有些项目有白色 space。但是,我认为使用 for 循环可以很容易地重新创建。
for i in $(cat test.txt); do openstack project create $i; done
但是,这不起作用,因为当我使用 $i
时它没有考虑白色 space,因此基本上任何在其间具有 space 的字符串都占两个字符串.这意味着当我遍历它并尝试重新创建它时,需要 Ansible Automation
并尝试为 Ansible
和 Automation
创建一个项目。为了处理这个问题,我可以将字符串放在双引号中
openstack project create "Ansible Automation"
这将创建项目。我如何在文本文件中解释 space 并使用 bash 中的 for 循环将我的字符串附加在双引号内?
for i in $(cat file.txt); do openstack project create <something with $i that places the string with white space in double quotes "<string>">; done
谁能帮我弄清楚如何计算 "<string1 string2>"
您也可以使用 mapfile
作为数组。
mapfile -t prj < file
for p in "${prj[@]}"; do echo "[$p]"; done
这应该正确引用您的项目名称。
根据您的需要推断。
您好,我有一项任务需要将项目从一个集群转移到另一个集群。 我能做到的唯一方法是重新创建项目。我有一个脚本可以工作并在 运行 OpenStack 集群中收集列出的项目,但我需要能够取出我存储的文件并使用它来重新创建项目。
这是收集可用项目的脚本:
#!/bin/bash
# ======================================================
# Author: Richard Barrett
# Date Created: 08/05/2021
# Organization: ITAdminInfra
# Purpose: Initialize OpenStack Project Gather Script
# ======================================================
start=`date +%s`
#set -e
# keep track of the last executed command
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
# echo an error message before exiting
#trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT
# EXIT Codes
# ==========
EXIT=1
EXIT_2=2
EXIT_126=126
AUTH=$(source ~/admin-openrc.sh)
OUTPUTDIR="/tmp/openstack_migrations"
OUTPUTFILE="$OUTPUTDIR/projects_listed_names_as_values.txt"
eval $AUTH
echo "======================================================="
echo " GATHERING PROJECT INFORMATION "
echo "======================================================="
# Make Directories in $OUTPUTDIR
if [ -d "$OUTPUTDIR" ]; then
# Take action if $OUTPUTDIR exists
echo "The Directory $OUTPUTDIR exists..."
echo "Check for Pre-Existing OpenStack Migration Info..."
else
echo "Directory $OUTPUTDIR does not exist..."
echo "Making $OUTPUTDIR for OpenStack Info..."
mkdir -p $OUTPUTDIR
fi
echo "Sourced Keystone via $AUTH succesful..."
echo "======================================================="
echo " OPENSTACK PROJECTS COLLECTED "
echo "======================================================="
openstack project list -c Name -f value
openstack project list -c Name -f value > $OUTPUTFILE
echo "======================================================="
printf "\n"
echo "Information on projects gathered has been stored in $OUTPUTFILE"
$OUTPUTFILE
包含如下内容:
[ OpenStack]$ cat /tmp/openstack_migrations/projects_listed_names_as_values.txt
testing_grounds
Michaud
Ansible Automation
Sustaining Development
Data Center Services
MF-DevStack
Kubernetes Labs
mso-ems
Network Development
Data Engineering
Data Center Operations Service Scanning
admin
service
OpenStack-Example
Petes-place
test
Image Factory
Network Automation
Fault and Performance Management
Microseg
Development
Docker Enterprise
Application Architecture
casa-de-pedro
有些项目有白色 space。但是,我认为使用 for 循环可以很容易地重新创建。
for i in $(cat test.txt); do openstack project create $i; done
但是,这不起作用,因为当我使用 $i
时它没有考虑白色 space,因此基本上任何在其间具有 space 的字符串都占两个字符串.这意味着当我遍历它并尝试重新创建它时,需要 Ansible Automation
并尝试为 Ansible
和 Automation
创建一个项目。为了处理这个问题,我可以将字符串放在双引号中
openstack project create "Ansible Automation"
这将创建项目。我如何在文本文件中解释 space 并使用 bash 中的 for 循环将我的字符串附加在双引号内?
for i in $(cat file.txt); do openstack project create <something with $i that places the string with white space in double quotes "<string>">; done
谁能帮我弄清楚如何计算 "<string1 string2>"
您也可以使用 mapfile
作为数组。
mapfile -t prj < file
for p in "${prj[@]}"; do echo "[$p]"; done
这应该正确引用您的项目名称。
根据您的需要推断。