Итерация более чем двух списков параллельно в/bin/sh

Я не знаю, является ли это правильным способом сделать это, но я больше не получаю первоначальную ошибку.

Во-первых, я создал несколько скрытых полей для соответствующих элементов, которые я хотел опубликовать, наряду с присвоением каждому входу идентификатора - следующие скрытые поля:

    
    
    
    
    

Во-вторых, я создал отдельный PayPalService, чтобы разделить функциональность, а также, я хотел, чтобы эти сообщения проходили через мой перехватчик, чтобы поместить jwt в заголовки:

import { Injectable } from "@angular/core";
import { HttpClient, HttpHeaders, HttpResponse } from "@angular/common/http";
import { ShoppingCartService } from "./shopping-cart.service";
import { ProductService } from "./product.service";
import { LoginService } from "./login.service";

@Injectable({
  providedIn: "root"
})
export class PaypalService {
  constructor(
    private http: HttpClient,
    private loginSrvc: LoginService,
    private prdSrvc: ProductService,
    private cartSrvc: ShoppingCartService
  ) {}

  addScript = false;
  paypalLoad = true;
  finalAmount;
  subTotal;

  paypalConfig = {
    env: "sandbox",
    client: {
      sandbox:
        "",
      production: ""
    },
    commit: true,
    payment: function(data, actions) {
      return actions.payment.create({
        transactions: [
          {
            amount: {
              total: document.getElementById("total").value,
              currency: "USD",
              details: {
                subtotal: document.getElementById("subTotal").value,
                tax: (document.getElementById("total").value * 0.07).toFixed(2),
                shipping: (document.getElementById("total").value * 0.03).toFixed(2),
                handling_fee: "1.00",
                shipping_discount: "0.00",
                insurance: (document.getElementById("total").value * 0.01).toFixed(2)
              }
            },
            description: "The payment from for-her application.",
            /* custom: "90048630024435", */
            invoice_number: document.getElementById("orders_id").value, // Insert a unique invoice number
            payment_options: {
              allowed_payment_method: "INSTANT_FUNDING_SOURCE"
            },
            soft_descriptor: document.getElementById("user_id").value,
            item_list: {
              items: [document.getElementById("product").value],
              shipping_address: {
                recipient_name: (document.getElementById("firstName").value + " " + document.getElementById("lastName").value),
                line1: document.getElementById("address").value,
                line2: document.getElementById("address2").value,
                city: document.getElementById("city").value,
                country_code: document.getElementById("country").value,
                postal_code: document.getElementById("zip").value
                phone: document.getElementById("phone").value,
                state: document.getElementById("state").value,
                email: document.getElementById("email").value
              }
            }
          }
        ],
        note_to_payer: "Contact us for any questions on your order."
      });
    },
    onAuthorize: (data, actions) => {
      return actions.payment.execute().then(payment => {
        // Do something when payment is successful.
        // window.alert("Thank you for your purchase! You order will be processed and shipped as soon as possible");
        document.getElementById("myModal").style.display = "block";
        document.getElementById("ModalBackdrop").style.display = "block";
        this.cartSrvc.postCart();
      });
    }
  };

  addPaypalScript() {
    this.addScript = true;
    return new Promise((resolve, reject) => {
      const scripttagElement = document.createElement("script");
      scripttagElement.src = "https://www.paypalobjects.com/api/checkout.js";
      scripttagElement.onload = resolve;
      document.body.appendChild(scripttagElement);
    });
  }

  public getSubTotal() {
    this.subTotal = (document.getElementById("total").value) -
    ((document.getElementById("total").value * 0.07) +
    (document.getElementById("total").value * 0.03) +
    (document.getElementById("total").value * 0.01) +
    1.00);
    return this.subTotal.toFixed(2);
  }

  public getToken(): string {
    return localStorage.getItem("jwt");
  }
}

Конечно, теперь у меня есть другая ошибка искаженного запроса, который помещен внутри jsonlint и, как вы можете видеть, он вернулся как действительный:

From jsonlint.com

Но главное, чтобы параметры / свойства работали:

along with subtotal calculations working

Если кто-нибудь может сказать мне, о чем новая ошибка, то я бы будь благодарен.

Error: Request to post https://www.sandbox.paypal.com/v1/payments/payment failed with 400 error. Correlation id: f31569c675597, f31569c675597

{
    "name": "MALFORMED_REQUEST",
    "message": "Incoming JSON request does not map to API request",
    "information_link": "https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST",
    "debug_id": "f31569c675597"
}

request/

Еще раз спасибо @ paulsm4 за предложение заглянуть под вкладку «Сеть», чтобы увидеть, действительно ли значение было опубликовано.

10
задан emk 13 February 2009 в 17:17
поделиться

7 ответов

Это - немного hacky, но делает задание:

#!/bin/sh
list1="1 2 3"
list2="a b c"
while [ -n "$list1" ]
do
    head1=`echo "$list1" | cut -d ' ' -f 1`
    list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
    head2=`echo "$list2" | cut -d ' ' -f 1`
    list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
    echo $head1 $head2
done
4
ответ дан 3 December 2019 в 15:36
поделиться

Вероятно, не портативный (смотрят на все те измы удара!), но легко читать, и кто-то еще мог бы найти это полезным...

list1="a b c"
list2="1 2 3"
array1=($list1)
array2=($list2)

count=${#array1[@]}
for i in `seq 1 $count`
do
    echo ${array1[$i-1]} ${array2[$i-1]}
done
14
ответ дан 3 December 2019 в 15:36
поделиться

Это должно быть довольно чистым решением, но если Вы не используете bashобработайте substition, он требует использования временных файлов. Я не знаю, лучше ли это или хуже, чем вызов cut и sed по каждому повторению.

#!/bin/sh

list1="1 2 3"
list2="a b c"
echo $list1 | sed 's/ /\n/g' > /tmp/a.$$
echo $list2 | sed 's/ /\n/g' > /tmp/b.$$

paste /tmp/a.$$ /tmp/b.$$ | while read item1 item2; do
    echo $item1 - $item2
done

rm /tmp/a.$$
rm /tmp/b.$$
4
ответ дан 3 December 2019 в 15:36
поделиться

Решение, не используя массивы:

list1="aaa1 aaa2 aaa3"
list2="bbb1 bbb2 bbb3"

tmpfile1=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1
tmpfile2=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1

echo $list1 | tr ' ' '\n'  > $tmpfile1
echo $list2 | tr ' ' '\n'  > $tmpfile2

paste  $tmpfile1  $tmpfile2

rm --force $tmpfile1  $tmpfile2
1
ответ дан 3 December 2019 в 15:36
поделиться

Как один лайнер:

list2="1 2 3"; 
list1="a b c"; 
for i in $list1; do 
    x=`expr index "$list2" " "`; 
    [ $x -eq 0 ] && j=$list2 || j=${list2:0:$x}; 
    list2=${list2:$x}; 
    echo "$i $j"; 
done
1
ответ дан 3 December 2019 в 15:36
поделиться

NEVERMIND, ВИДЕЛ "ГРАНИЦУ" и думал "ГРАНИЦА СНОВА". Отъезд этого здесь, потому что это могло бы быть полезно для кого-то, но ясно не ответа на вопрос, который задают, извините!

--

Это имеет некоторые недостатки (это корректно не обрабатывает списки, которые являются различными размерами), но это работает на пример, который Вы дали:

#!/bin/bash

list1="a b c"
list2="1 2 3"

c=0
for i in $list1
do
  l1[$c]=$i
  c=$(($c+1))
done

c=0
for i in $list2
do
  echo ${l1[$c]} $i
  c=$(($c+1))
done

Существует больше корректных способов использовать общие инструменты Unix как awk и сокращение, но вышеупомянутое является реализацией чистого удара согласно просьбе

Комментируя принятый ответ, это не работало на меня или в Linux или в Солярисе, проблемой был \S ярлык класса символов в regexp для sed. Я заменил его [^], и это работало:

#!/bin/sh
list1="1 2 3"
list2="a b c"
while [ -n "$list1" ]
do
    head1=`echo "$list1" | cut -d ' ' -f 1`
    list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
    head2=`echo "$list2" | cut -d ' ' -f 1`
    list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
    echo $head1 $head2
done
1
ответ дан 3 December 2019 в 15:36
поделиться

Я работал над находящимся в sed ответом, когда первые решения запустили показ здесь. Но после дальнейшего расследования, оказалось, что объекты в списке были разделены новыми строками, не пробелами, которые позволили мне идти с решением на основе головы и хвоста:

original_revs="$(cd original && git rev-parse --all)" &&
working_revs="$(cd working && git rev-parse --all)" &&
while test -n "$original_revs"; do
    original_commit="$(echo "$original_revs" | head -n 1)" &&
    working_commit="$(echo "$working_revs" | head -n 1)" &&
    original_revs="$(echo "$original_revs" | tail -n +2)" &&
    working_revs="$(echo "$working_revs" | tail -n +2)" &&
    ...
done

Я отправляю это на всякий случай, кто-то встречается с этим вариантом проблемы, но я награждаю принятый ответ на основе проблемы, как отправлено.

0
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: