for循环中的变量不是动态的

时间:2015-12-13 14:56:41

标签: bash shell unix sh

我制作了一个脚本,用户输入了一系列字母

我在我的剧本中写了这个循环:

#variable that contains the alphabet"
Alphabet="abcdefghijklmnopqrstuvwxyz"
#the user input
Input1=$1
#the length of the string the user inputs
lengthAlphabetInput=${#1} 

for position in `seq 1 $lengthAlphabetInput`
do

 letterAtPositionLength=$(($lengthAlphabetInput-$position))
 letterAtPosition=$(echo "${Input1:$letterAtPositionLength:1}")
 alphabetAtPositionLength=$(($lengthAlphabetInput-$position))
 alphabetAtPosition=$(echo "${Alphabet:$alphabetAtPositionLength:1}")

 sed "s/$alphabetAtPosition/$letterAtPosition/g" file.txt

done

我预计如果用户输入 ./script.sh xyz

它会改变每一个

  • a with x
  • b with y
  • c with z

但是它只用x取代每个a。由于某种原因,它会跳过其余部分。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您的 /** * Display the form and Handle it * Not route needed */ public function newAction(Request $request, Products $product) { $em = $this->getDoctrine()->getManager(); $message = new MessageMap(); $form = $this->createCreateForm($message); $product = $em->getRepository('ApxDevUsersBundle:Products')->find($product); $form->handleRequest($request); $user = $this->get('security.token_storage')->getToken()->getUser(); if($form->isValid()) { $data = $form->getData(); //var_dump($data);die; (not work) $product = $em->getRepository('ApxDevUsersBundle:Products')->find($product); if($user->isGranted('ROLE_USER')) { $message->setFromID($user->getUserInfo()); }else{ $message->setEmail($data->get('email')); } $message->setToID($product->getUserInfo()); $em->persist($message); $em->flush(); $x = $product->getCity(); $city = $em->getRepository('ApxDevPagesBundle:City')->findOneby(array('libelle' => trim($x))); $this->get('session')->getFlashBag()->add('warning', $this->get('translator')->trans('product.create_first')); return $this->redirect($this->generateUrl('home_show', array('entity' => $product, 'city' => $city))); } return $this->render('ApxDevMessageBundle:Message:modules/email.html.twig', array( 'form' => $form->createView(), )); } 命令未将结果保存在任何位置,只需将其打印到sed即可。如果你有GNU sed,你可以使用stdout标志来修改文件。 E.g:

-i

否则您可以将结果写入临时文件并将其复制回来:

sed -i "s/$alphabetAtPosition/$letterAtPosition/g" file.txt

其他版本的tmp_file=$(mktemp) sed "s/$alphabetAtPosition/$letterAtPosition/g" file.txt > "$tmp_file" mv -f "$tmp_file" file.txt 可能与sed具有相似的标记,因此请查看您的手册页以获取本地选项。

答案 1 :(得分:1)

您的脚本将受益于y的{​​{1}}命令,该命令完全符合您的要求:

sed

引用man page

y/source/dest/
       Transliterate the characters in the pattern space which appear
       in source to the corresponding character in dest.

以下是您在脚本中使用$ echo abcdef > a $ sed 'y/abc/xyz/' a xyzdef 的方法:

sed y

请注意此解决方案如何不需要循环,只读取/写入文件一次。